我需要在我的表单清理方法中验证上传的 XML 文件的内容,但我无法打开文件进行验证。它接缝,在 clean 方法中,文件尚未从内存(或临时目录)移动到目标目录。
例如,以下代码不起作用,因为文件尚未移动到该目的地。它仍在内存中(或临时目录):
xml_file = cleaned_data.get('xml_file')
xml_file_absolute = '%(1)s%(2)s' % {'1': settings.MEDIA_ROOT, '2': xml_file}
xml_size = str(os.path.getsize(xml_file_absolute))
当我查看“cleaned_data”变量时,它显示如下:
{'xml_file': <InMemoryUploadedFile: texting.nzb (application/octet-stream)>}
cleaned_data.get('xml_file')
仅返回字符串形式的“texting.nzb”。
是否有其他方法可以访问内存(或临时目录)中的文件?
同样,这是在我的表单的 clean
方法中,该方法绑定(bind)到默认管理 View 中。我一次又一次地被告知所有验证都应该在表单中处理,而不是在 View 中。正确吗?
最佳答案
我假设您已使用以下方式将表单绑定(bind)到文件:
my_form = MyFormClass(request.POST, request.FILES)
如果有,一旦表单通过验证,您就可以使用 request.FILES 字典访问文件内容本身:
if my_form.is_valid():
data = request.FILES['myfile'].read()
request.FILES['myfile']对象是一个UploadedFile对象,所以它支持类文件的读/写操作。
如果您需要从表单的 clean
方法(或任何清理机制的方法)中访问文件内容,您做对了。 cleaned_data.get('xml_file')
返回 UploadedFile目的。该对象的 __str__
方法只是打印出字符串,这就是为什么您只看到文件名的原因。但是,您可以获得全部内容:
xml_file = myform.cleaned_data.get('xml_file')
print xml_file.read()
文档的这一部分有一些很好的例子:http://docs.djangoproject.com/en/dev/topics/http/file-uploads/
关于python - Django:在内存中打开上传的文件;在 Form Clean 方法中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/635524/