python - Django:在内存中打开上传的文件;在 Form Clean 方法中?

标签 python django

我需要在我的表单清理方法中验证上传的 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/

相关文章:

python - 计算 Django 中的选择

Python 在读取时截断行

python - 在 Python 中显示图像大小的正确方法是什么?

python - Mysql - 如何在比较两个条目时仅识别和选择不同的列?

python - docker-compose的nginx和django设置

python - google CloudSQL mysql 表情符号(1366、 "Incorrect string value: '\\xF0\\x9F\\x98\\x80\\xF0\\x9F.. .' for column ' 名称'在第 1 行")

python - 如何在Python中将lxml字符串与另一个字符串连接

Python tkinter 创建两个窗口

django - 在本地主机上运行 Django 服务器

Python/Django : Email template is not rendered. 显示 html 标签并且不转换实体