我有一个带有两个图像区域的模型,一个源图像和一个缩略图。
当我更新新的源图像时,保存它,然后尝试读取源图像以将其裁剪/缩放到缩略图我从PIL获得“关闭文件的I / O操作”错误。
如果我更新源图像,请不要保存源图像,然后尝试读取源图像以进行裁剪/缩放,我从PIL中收到“尝试从已关闭文件中读取”错误。
在这两种情况下,源图像实际上都已保存,并在以后的请求/响应循环中可用。
如果我没有在单个请求/响应循环中裁剪/缩放,而是在一个页面上上传,然后在另一个页面中裁剪/缩放,这一切都正常。
这似乎是一个缓存的缓冲区,可以通过PIL或Django文件存储重复使用。有关如何在保存后使ImageField可读的想法吗?
更多信息... ImageField在保存后显然正在关闭基础文件。有没有办法强制刷新ImageField?我看到一些人使用seek(0),但在这种情况下不起作用。
答案 0 :(得分:17)
ImageField中存在一个我已追踪并submitted to the django project的错误。
如果您有一个带有ImageField?的简单模型,则以下代码将失败并显示“对已关闭文件的I / O操作”:
instance = MyClass.objects.get(...)
w = instance.image.width
h = instance.image.height
original = Image.open(instance.image)
解决方法是重新打开文件:
instance = MyClass.objects.get(...)
w = instance.image.width
h = instance.image.height
instance.image.open()
original = Image.open(instance.image)