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

15 浏览
0 Comments

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

我正在开发一个网站。用户可以上传一个文件。这个文件是docx格式的。在他上传文件并选择他想要翻译文件的语言后,我想将他重定向到另一个页面,他可以在那里看到翻译的价格。价格取决于特定的语言和docx文件中的字符数。

我想不出如何处理上传的文件。我有一个函数,它得到文件路径并返回字符数。在上传文件并点击提交后,我想调用此函数,以便我可以呈现具有估计价格的新页面。

我已经阅读到我可以在request.FILES [\'file\']上调用temporary_file_path,但它会引发

\'InMemoryUploadedFile\' object has no attribute \'temporary_file_path\'

我希望找出上传的文件包含多少个字符并将其发送到另一个视图-/order-estimation

VIEW:

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)

admin 更改状态以发布 2023年5月23日
0
0 Comments

InMemoryUploadedFile 不提供 temporary_file_path。该内容存储在内存中,正如类名所示。

默认情况下,Django 使用 InMemoryUploadedFile 处理不超过 2.5MB 的文件,而更大的文件则使用 TemporaryFileUploadHandler。后者提供了所需的 temporary_file_path 方法。 Django 文档

因此,一个简单的方法是将您的设置更改为始终使用 TemporaryFileUploadHandlerFILE_UPLOAD_HANDLERS

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

请记住,当您有大量同时上传的小型请求时,这并不是最有效的方法。

0