代码之家  ›  专栏  ›  技术社区  ›  Rob Osborne

从保存的ImageField读取时,Django给出“关闭文件上的I/O操作”错误。

  •  9
  • Rob Osborne  · 技术社区  · 14 年前

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

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

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

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

    如果我不在一个请求/响应循环中裁剪/缩放,而是在一个页面上上载,然后在另一个页面上裁剪/缩放,这一切都可以正常工作。

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

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

    1 回复  |  直到 14 年前
        1
  •  17
  •   Rob Osborne    14 年前

    在ImageField中有一个bug,我已经跟踪到了它, 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)