ImageField和MemoryFileUploadHandler的表单验证错误

时间:2013-08-21 08:53:27

标签: django django-file-upload

ImageField有一个表单,它返回验证错误

"Upload a valid image. The file you uploaded was either not an image or a corrupted image."

在我看来,我正在尝试阅读图像文件内容:

image = self.request.FILES.get('image')
if image:
    content = ''.join(image.chunks())

如果我使用image.chunks()注释行,则不会发生验证错误,如果从FILE_UPLOAD_HANDLERS设置中删除“django.core.files.uploadhandler.MemoryFileUploadHandler”,也不会显示。

原因可能是MemoryFileUploadHandler(InMemoryUploadedFile)创建的文件对象。

我的猜测可能是在读取之后没有调用file.seek(0),它将文件读取器指针设置为文件的乞讨。

可能是ImageFile.to_python假设指针设置为开头。 在ImageField.to_python中我添加了

data.file.seek(0) 

之前

file = StringIO(data.read()) 

之后我没有得到图像验证错误。

这是正确的行为吗?或者ImageField不应该假设文件没有被读取?或者InMemoryUploadedFile应该在块迭代器结束其工作后调用file.seek(0)?

我的django版本是1.4.3

1 个答案:

答案 0 :(得分:0)

是的,这是预期的行为。您应该在验证表单之前将文件位置重置为开头:

image = self.request.FILES.get('image')
if image:
content = ''.join(image.chunks())
...
image.seek(0)