1

我创建了一个网站,它使用 sorl-thumbnail 来调整上传的图像大小。大多数图像都在调整大小时没有任何问题,但很少有人收到以下错误:

Caught IOError while rendering: not enough data
Request Method: GET
Request URL:    http://localhost:8000/user/nash22/photographs/
Django Version: 1.3.1
Exception Type: TemplateSyntaxError
Exception Value:    
Caught IOError while rendering: not enough data
Exception Location: /usr/local/lib/python2.7/site-packages/PIL/TiffImagePlugin.py in load, line 382
Python Executable:  /usr/local/bin/python
Python Version: 2.7.1

我在谷歌上搜索,但找不到任何相关答案。有人可以帮助我发生了什么,我该如何解决?谢谢你。

编辑

完整的追溯

回溯(最近一次通话最后):

文件“/lib/python2.7/django/core/handlers/base.py”,第 111 行,在 get_response response = callback(request, *callback_args, **callback_kwargs)

文件“/home/swaroop/project/apps/photography/views.py”,第 702 行,在 showPhoto context_instance=RequestContext(request))

文件“/lib/python2.7/django/shortcuts/init .py ”,第 20 行,在 render_to_response 返回 HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)

文件“/lib/python2.7/django/template/loader.py”,第 188 行,在 render_to_string 返回 t.render(context_instance)

文件“/lib/python2.7/django/template/base.py”,第 123 行,在渲染中返回 self._render(context)

_render 中的文件“/lib/python2.7/django/template/base.py”,第 117 行 return self.nodelist.render(context)

文件“/lib/python2.7/django/template/base.py”,第 744 行,在渲染 bits.append(self.render_node(node, context))

文件“/lib/python2.7/django/template/base.py”,第 757 行,在 render_node 返回 node.render(context)

文件“/lib/python2.7/django/template/loader_tags.py”,第 127 行,在渲染中返回已编译_parent._render(context)

_render 中的文件“/lib/python2.7/django/template/base.py”,第 117 行 return self.nodelist.render(context)

文件“/lib/python2.7/django/template/base.py”,第 744 行,在渲染 bits.append(self.render_node(node, context))

文件“/lib/python2.7/django/template/base.py”,第 757 行,在 render_node 返回 node.render(context)

文件“/lib/python2.7/django/template/loader_tags.py”,第 64 行,在渲染结果 = block.nodelist.render(context)

文件“/lib/python2.7/django/template/base.py”,第 744 行,在渲染 bits.append(self.render_node(node, context))

文件“/lib/python2.7/django/template/base.py”,第 757 行,在 render_node 返回 node.render(context)

文件“/lib/python2.7/sorl/thumbnail/templatetags/thumbnail.py”,第 45 行,在渲染中返回 self._render(context)

文件“/lib/python2.7/sorl/thumbnail/templatetags/thumbnail.py”,第 97 行,在渲染文件,几何,**选项中

文件“/lib/python2.7/sorl/thumbnail/base.py”,第 61 行,在 get_thumbnail 缩略图中)

文件“/lib/python2.7/sorl/thumbnail/base.py”,第 86 行,在 _create_thumbnail image = default.engine.create(source_image, geometry, options)

文件“/lib/python2.7/sorl/thumbnail/engines/base.py”,第 15 行,在 create image = self.orientation(image, geometry, options)

文件“/lib/python2.7/sorl/thumbnail/engines/base.py”,第 26 行,方向返回 self._orientation(image)

文件“/lib/python2.7/sorl/thumbnail/engines/pil_engine.py”,第 29 行,在 _orientation exif = image._getexif()

_getexif info.load(file) 中的文件“/usr/local/lib/python2.7/site-packages/PIL/JpegImagePlugin.py”,第 381 行

文件“/usr/local/lib/python2.7/site-packages/PIL/TiffImagePlugin.py”,第 382 行,加载引发 IOError,“数据不足”

IOError:没有足够的数据

4

1 回答 1

7

更新

image._getexif据称是高度实验性的。参考 sorl -thumbnailissue #98,您可以将代码更新为

def _orientation(self, image):
    try:
        exif = image._getexif()
    except (AttributeError, IOError):
        exif = None

这是由 PIL 尝试加载损坏或可能不受支持的 TIFF 文件引起的。
通常当你使用Django 时forms.ImageField,Django 会检查上传图片的正确性。
因此,您需要:

  • 确保您使用forms.ImageField(默认为models.ImageField)来处理视图中的上传
  • 检查上传的图片

    from PIL import Image
    Image.open(path).load()
    
  • 使用处理 TIFF 的工具包打开图像,如果可以打开,将其保存为 Jpeg 或 Png 并更新模型实例的字段以指向新文件。

您也可以限制用户上传普通格式,例如 jpeg/png/gif 而不是 TIFF

于 2012-05-14T12:41:50.150 回答