如何在Django上传后访问文件?

时间:2016-06-05 15:24:54

标签: django django-views django-file-upload

我正在网络上工作。 User可以上传文件。此文件采用docx格式。在他上传文件并选择他想要将文件翻译成哪种语言之后,我想将他重定向到另一个页面,在那里他可以看到翻译价格。价格取决于docx文件中的特定语言和字符数。

我无法弄清楚如何处理上传的文件。我有一个函数,它获取文件的路径并返回一些字符。上传文件并单击提交后,我想调用此函数,以便我可以使用估计的价格呈现新页面。

我读过我可以在temporary_file_path上致电request.FILES['file'],但会提出

  

'InMemoryUploadedFile'对象没有属性'temporary_file_path'

我想了解上传文件中包含的字符数,并将其发送到另一个视图/order-estimation

查看:

def create_order(request):
    LanguageLevelFormSet = formset_factory(LanguageLevelForm, extra=5, max_num=5)
    language_level_formset = LanguageLevelFormSet(request.POST or None)
    job_creation_form = JobCreationForm(request.POST or None, request.FILES or None)

    context = {'job_creation_form': job_creation_form,
               'formset': language_level_formset}

    if request.method == 'POST':
        if job_creation_form.is_valid() and language_level_formset.is_valid():
            cleaned_data_job_creation_form = job_creation_form.cleaned_data
            cleaned_data_language_level_formset = language_level_formset.cleaned_data
            for language_level_form in [d for d in cleaned_data_language_level_formset if d]:
                language = language_level_form['language']
                level = language_level_form['level']

                Job.objects.create(
                        customer=request.user,
                        text_to_translate=cleaned_data_job_creation_form['text_to_translate'],
                        file=cleaned_data_job_creation_form['file'],
                        short_description=cleaned_data_job_creation_form['short_description'],
                        notes=cleaned_data_job_creation_form['notes'],
                        language_from=cleaned_data_job_creation_form['language_from'],
                        language_to=language,
                        level=level,
                )
                path =  request.FILES['file'].temporary_file_path
                utilities.docx_get_characters_number(path) # THIS NOT WORKS

            return HttpResponseRedirect('/order-estimation')
        else:
            return render(request, 'auth/jobs/create-job.html', context=context)

    return render(request, 'auth/jobs/create-job.html', context=context)

1 个答案:

答案 0 :(得分:3)

InMemoryUploadedFile未提供temporary_file_path。内容存在于“记忆中” - 正如班级所暗示的那样。

默认情况下,Django将InMemoryUploadedFile用于最大2.5MB的文件,较大的文件使用TemporaryFileUploadHandler。后者提供有问题的temporary_file_path方法。 Django Documentation

一种简单的方法是将FILE_UPLOAD_HANDLERS的设置更改为始终使用TemporaryFileUploadHandler

FILE_UPLOAD_HANDLERS = [
    'django.core.files.uploadhandler.TemporaryFileUploadHandler',
]

请注意,当您的网站包含很多并发小型上传请求时,这不是最有效的方法。