1

I'm doing a simple CRUD with FastAPI to store an image and its information in MongoDB, so far this is my code:

@app.post("/postImage")
async def image_post(id: str, author: str, title: str, file: UploadFile = File(...)):
    
    file.filename = f"{uuid.uuid4()}.jpg"
    contents = await file.read()

    image = base64.b64decode(contents)
 
    data = {"_id": id, "author": author, "title": title ,"data": image, "posted": False,"uploaded": datetime.now()}

    try:
      collection.insert_one(data)
    except:
        print('Error')

    return("Added successfully")

However, when I'm trying to convert the bytes to string it returns me an error.

image = base64.b64decode(contents)
print(image.decode('utf-8'))

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 11: invalid start byte

I've tried many alternatives, but I don't know what's wrong.

3
  • 1
    Did you want image = base64.b64encode(contents) before inserting the document? Or maybe just store it as BSON binary data? Commented Feb 20, 2022 at 2:11
  • I'm trying to store it as a string so I can use it later in the get function Commented Feb 20, 2022 at 2:22
  • "store it as a string" your database and future you will hate every part of this idea. just save it as a file, on a proper file storage. Commented Feb 20, 2022 at 3:50

1 Answer 1

2

Mongo suggest this to store files bigger than 16mb (GridFS)

I suggest you do this: First create directory in your project named "static" then do this

import uuid
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
from fastapi import UploadFile, File, status
import aiofiles

app = FastAPI()

app.mount("/static", StaticFiles(directory="static"), name="static")


@app.post("/")
async def post_endpoint(in_file: UploadFile = File(...)):
    random_name = uuid.uuid4()
    async with aiofiles.open(f"static/{random_name}.jpg", "wb") as out_file:
        while content := await in_file.read(1024):  # async read chunk
            await out_file.write(content)


    return {"Result": "OK"}

and then save your file name in db like string.

for get image you can use this : http://127.0.0.1:8000/static/uuiduuiduuiduuiduuiduuiduuid.jpg

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.