0

有一个带有 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

4

1 回答 1

0

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

image = self.request.FILES.get('image')
if image:
content = ''.join(image.chunks())
...
image.seek(0)
于 2013-08-21T09:25:40.877 回答