使用Pillow保存内存文件对象

7 投票
1 回答
5658 浏览
提问于 2025-04-18 04:37

在我的Django项目中,我有一个内存中的上传文件。我用Pillow这个库打开它,旋转一下,然后再保存回去。但是最后一步其实没有成功。当我把它保存到一个文件时,旋转后的图片是正确的。那么,我该怎么把它保存回这个文件对象,而不是保存成一个实际的文件呢?

    image = request.FILES['file']
    img = Image.open(image)
    img = img.rotate(90)
    img.save("sample.jpeg", "jpeg") #this is correct
    img.save(image, "jpeg") #this does not change the actual in memory image

1 个回答

9

你需要重置底层的StreamIO对象的流位置,这个对象是用来保存你上传的文件的。否则,Image.save() 只会在流的末尾添加内容。

在尝试从内存中再次读取文件之前,你可能也需要重置流的位置。

image = request.FILES['file']
img = Image.open(image)
img = img.rotate(90)
image.seek(0)
img.save(image, "jpeg")
image.seek(0)
image.read()

请注意,UploadedFileInMemoryUploadedFile的基类)会记录文件的大小,如果你更改了底层的文件对象,依赖于InMemoryUploadedFile.size的代码可能会感到困惑。

撰写回答