如何在Django中将Pillow处理过的图像上传到S3?

3

我正在尝试运行下面的代码,但是它报错了。我不确定我做错了什么。任何帮助都将不胜感激。

def upload_img(request):
    maxsize = (1024, 1024)
    im = Image.open(request.FILES['image'])
    im.thumbnail(maxsize)
    img_name = 'test.jpg'
    s3 = boto3.client('s3')
    s3.put_object(
        Bucket=settings.AWS_S3_DEV_IMG_BUCKET,
        Key=img_name,
        Body=im.save(img_name, "JPEG"),
        ContentType='image/jpeg',
    )

错误:

'ParamValidationError: Parameter validation failed:
Invalid type for parameter Body, value: None, type: <type 'NoneType'>, valid types: <type 'str'>, <type 'bytearray'>, file-like object
1个回答

9
Image.save() 方法不会返回图像,它会将其保存到磁盘(或缓冲区)并返回 None。这就是为什么 boto 抱怨参数为 NoneType 的原因。
你需要将数据保存到某个临时缓冲区,然后将其传递给 boto。例如:
buffer = io.BytesIO()
im.save(buffer, "JPEG")
buffer.seek(0) # rewind pointer back to start
s3.put_object(
    Bucket=settings.AWS_S3_DEV_IMG_BUCKET,
    Key=img_name,
    Body=buffer,
    ContentType='image/jpeg',
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接