使用Pillow保存内存文件对象
在我的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()
请注意,UploadedFile
(InMemoryUploadedFile
的基类)会记录文件的大小,如果你更改了底层的文件对象,依赖于InMemoryUploadedFile.size
的代码可能会感到困惑。