如何使用 pymongo 在 MongoDB 中存储图像?

How to storage an image in MongoDB with pymongo?

我正在使用 FastAPI 做一个简单的 CRUD 以将图像及其信息存储在 MongoDB 中,到目前为止这是我的代码:

@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")

但是,当我尝试将字节转换为字符串时,returns 出错了。

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

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

我尝试了很多替代方法,但我不知道哪里出了问题。

Mongo 建议用这个来存储大于 16mb 的文件 (GridFS)

我建议你这样做: 首先在名为“static”的项目中创建目录,然后执行此操作

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"}

然后将你的文件名像字符串一样保存在数据库中。

要获取图像,您可以使用以下方法: http://127.0.0.1:8000/static/uuiduuiduuiduuiduuiduuiduuid.jpg