用枕头保存在内存文件对象中

时间:2014-04-28 18:01:11

标签: python django python-2.7 python-imaging-library pillow

在我的django项目中,我有一个inmemoryuploaded文件,然后我用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 个答案:

答案 0 :(得分:4)

您必须重置保存上传文件的基础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的代码可能会混淆。