【问题标题】:Django: Open uploaded file while still in memory; In the Form Clean method?Django:在内存中打开上传的文件;在 Form Clean 方法中?
【发布时间】:2010-10-12 17:46:20
【问题描述】:

我需要在我的 Form clean 方法中验证上传的 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 方法中,该方法与默认管理视图相关联。我一次又一次地被告知所有验证都应该在表单中处理,而不是在视图中处理。对吗?

【问题讨论】:

    标签: python django


    【解决方案1】:

    我假设您已使用以下方式将表单绑定到文件:

    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/

    【讨论】:

    • 我没有在视图中写任何东西。我在我的表单中使用“干净”方法进行验证,然后使用默认管理视图进行测试。表单中的所有验证不是“Django 方式”吗?
    • 在哪里做都没有关系。您需要访问 request.FILES 以获取文档显示的临时文件。如果需要,您可以在 Form 类中执行此操作。
    • 我更新了我的答案,说明如何从表单本身内部获取上传的文件对象,因为在您的情况下,form.is_valid() 需要该文件。
    • 只需确保您已将表单绑定到视图中带有 request.FILES 的文件。
    • 感谢您的帮助。我假设管理视图会自动使用 request.FILES 绑定表单,不是吗?当我写自己的观点时,我一定会自己做。
    猜你喜欢
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2019-11-26
    • 2018-07-03
    相关资源
    最近更新 更多