【问题标题】:How to save an uploaded image to FastAPI using Python Imaging Library (PIL)?如何使用 Python 图像库 (PIL) 将上传的图像保存到 FastAPI?
【发布时间】:2022-09-23 03:41:13
【问题描述】:

我正在使用图像压缩来减小图像大小。提交发布请求时,我没有收到任何错误,但无法弄清楚为什么图像没有保存。这是我的代码:

@app.post(\"/post_ads\")
async def create_upload_files(title: str = Form(),body: str = Form(), 
    db: Session = Depends(get_db), files: list[UploadFile] = File(description=\"Multiple files as UploadFile\")):
    for file in files:
        im = Image.open(file.file)
        im = im.convert(\"RGB\")
        im_io = BytesIO()
        im = im.save(im_io, \'JPEG\', quality=50) 
  • 您的图像保存在im_io 内的 RAM 中。将最后一行更改为im.save(im_io, \'JPEG\', quality=50)
  • @Mark Setchell 这是我的最后一行im.save(im_io, \'JPEG\', quality=50) 我需要改变什么?我试过im = im.save(\'JPEG\', quality=50)得到这个错误ValueError: unknown file extension:

标签: python python-imaging-library fastapi


【解决方案1】:

PIL.Image.open() 采用 fp argumnet 以下内容:

fpfilename(字符串)、pathlib.Path 对象或 file 对象。这 文件对象必须实现file.read()file.seek()file.tell() 方法,并以二进制模式打开。

使用BytesIO 流,您需要这样做:Image.open(io.BytesIO(file.file.read())),如this answer 所示(请参阅客户端)。但是,您实际上不必使用内存中的字节缓冲区,因为您可以使用UploadFile.file 属性获取实际的文件对象。根据documentation

file:一个SpooledTemporaryFile(一个file-like 对象)。 这是您可以直接传递给其他人的实际 Python 文件 期望“类文件”对象的函数或库。

例子:

# ...
from PIL import Image

@app.post("/upload")
def upload(file: UploadFile = File()):
    try:        
        im = Image.open(file.file)
        if im.mode in ("RGBA", "P"): 
            im = im.convert("RGB")
        im.save('out.jpg', 'JPEG', quality=50) 
    except Exception:
        # ...
    finally:
        file.file.close()
        im.close()

有关如何使用 FastAPI 上传文件/图像的更多详细信息和代码示例,请查看 this answerthis answer。此外,请查看this answer,了解有关使用defasync def 定义端点的更多信息。

【讨论】:

    【解决方案2】:

    我假设您正在写信给BytesIO 以获得“在记忆中”JPEG 不会因写入磁盘和弄乱文件系统而减慢您的速度。

    如果是这样,你想要:

    im = Image.open(file.file)
    im = im.convert("RGB")
    im_io = BytesIO()
    # create in-memory JPEG in RAM (not disk)
    im.save(im_io, 'JPEG', quality=50)
    
    # get the JPEG image in a variable called JPEG
    JPEG = im_io.get_value()
    

    【讨论】:

      猜你喜欢
      • 2016-04-11
      • 1970-01-01
      • 2020-08-30
      • 2013-01-05
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      • 1970-01-01
      相关资源
      最近更新 更多