【问题标题】:How to process a file uploaded using a form in Django?如何处理在 Django 中使用表单上传的文件?
【发布时间】:2020-11-14 05:54:00
【问题描述】:

我使用 FileField 构建了一个表单,以便上传要处理的文件。奇怪的是,在我可以在视图中执行任何操作之前,文件似乎已关闭。验证表单后遇到 ValueError:

"对关闭文件的 I/O 操作"

我可以看到该文件已正确检测到,但在尝试读取时已关闭。

注意:Django 版本 2.2.25。

forms.py

class FileImportForm(forms.Form):
    headers = ["lastname","firstname","gender","title","entity","email","company","address","phone"]
    file = forms.FileField(label='CSV file',validators=[CsvFileValidator(headers)])
    
    def clean_file(self):
        file = self.cleaned_data['file']
        return file   

views.py

@login_required
def file_import(request):
    if request.method == 'POST': 
        form = FileImportForm(request.POST,request.FILES)

        if form.is_valid():
            if request.FILES['file']:
                file_post = request.FILES['file']
                # Offending line below (I/O operation on closed file)
                file_content = file_post.read().decode('UTF-8')

                return redirect("/foo")
    else:
        form = FileImportForm()
    
    return render(request,"file_import.html", { 'form': form })

如何正确处理上传的文件(读取等)?

【问题讨论】:

    标签: python-3.x django forms file


    【解决方案1】:

    出现错误是因为您没有正确打开文件。这是工作方式:

    file_post = request.FILES['file']
    f = open(file_post, "w")
    

    由于python的文件操作也自带只读方式,所以不能直接file_content = file_post.read().decode('UTF-8'),因为你没有让这个文件可写。

    Reference.

    编辑

    由于上传文件类型可能不正确,需要进行更多转换。比如:

    def my_view(request):
        uploaded_file = request.FILES['file']
        str_text = ''
        for line in uploaded_file:
            str_text = str_text + line.decode()  # "str_text" will be of `str` type
        # do something
        return something
    

    Reference2

    【讨论】:

    • 这不起作用,它会抛出 TypeError 异常“预期的 str、字节或 os.PathLike 对象,而不是 InMemoryUploadedFile”。类型不是 open 的预期类型之一。
    • 那么您可能应该考虑其他方式。由于演示卡在txt 文件中,可能InMemoryUploadedFile 是另一种不符合python 规则的类型
    • 我刚刚编辑了我的答案。你能利用我的编辑吗?
    • 这次出现异常“对已关闭文件的 I/O 操作”。需要以某种方式转换原始文件内容。
    • 我放在那里的第二个参考是这样的:uploaded_file.read()。如果您正在尝试实际编写文件,则可能正在寻找其他内容。
    猜你喜欢
    • 2010-12-30
    • 2017-02-24
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 2017-11-02
    相关资源
    最近更新 更多