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
答案 0 :(得分:0)
是的,这是预期的行为。您应该在验证表单之前将文件位置重置为开头:
image = self.request.FILES.get('image')
if image:
content = ''.join(image.chunks())
...
image.seek(0)