Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django给出了;关闭文件上的I/O操作“;从保存的图像字段读取时出错_Django_Django Models - Fatal编程技术网

Django给出了;关闭文件上的I/O操作“;从保存的图像字段读取时出错

Django给出了;关闭文件上的I/O操作“;从保存的图像字段读取时出错,django,django-models,Django,Django Models,我有一个模型,有两个图像字段,一个源图像和一个缩略图 当我更新新的源图像时,保存它,然后尝试读取源图像以将其裁剪/缩放为缩略图,我从PIL中得到“关闭文件上的I/O操作”错误 如果我更新源图像,不保存源图像,然后尝试将源图像读取到裁剪/缩放,则PIL会出现“尝试从关闭的文件读取”错误 在这两种情况下,源映像实际上已保存,并可在以后的请求/响应循环中使用 如果我不在一个请求/响应循环中裁剪/缩放,而是在一个页面上上传,然后在另一个页面上裁剪/缩放,这一切都很好 这似乎是一个缓存缓冲区,通过PIL或

我有一个模型,有两个图像字段,一个源图像和一个缩略图

当我更新新的源图像时,保存它,然后尝试读取源图像以将其裁剪/缩放为缩略图,我从PIL中得到“关闭文件上的I/O操作”错误

如果我更新源图像,不保存源图像,然后尝试将源图像读取到裁剪/缩放,则PIL会出现“尝试从关闭的文件读取”错误

在这两种情况下,源映像实际上已保存,并可在以后的请求/响应循环中使用

如果我不在一个请求/响应循环中裁剪/缩放,而是在一个页面上上传,然后在另一个页面上裁剪/缩放,这一切都很好

这似乎是一个缓存缓冲区,通过PIL或Django文件存储以某种方式被重用。如何在保存后使ImageField可读


更多信息。。。ImageField在保存后显然正在关闭基础文件。有没有办法强制刷新ImageField?我看到一些人在使用seek(0),但在这种情况下,这将不起作用。

在ImageField中有一个bug,我已经跟踪并验证了它

如果您有一个带有ImageField?的简单模型,则以下代码将因“关闭文件上的I/O操作”而失败:

解决方法是重新打开文件:

instance = MyClass.objects.get(...)
w = instance.image.width
h = instance.image.height
instance.image.open()
original = Image.open(instance.image)

如果其他人像我一样好奇,上面引用的图像是PIL的图像-来自PIL导入图像“imageField.open()不会更改文件的内容,但会重置指针”
instance = MyClass.objects.get(...)
w = instance.image.width
h = instance.image.height
instance.image.open()
original = Image.open(instance.image)