如何在Django中上传文件后访问文件?
如何在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日
InMemoryUploadedFile
不提供 temporary_file_path
。该内容存储在内存中,正如类名所示。
默认情况下,Django 使用 InMemoryUploadedFile
处理不超过 2.5MB 的文件,而更大的文件则使用 TemporaryFileUploadHandler
。后者提供了所需的 temporary_file_path
方法。 Django 文档
因此,一个简单的方法是将您的设置更改为始终使用 TemporaryFileUploadHandler
:FILE_UPLOAD_HANDLERS:
FILE_UPLOAD_HANDLERS = [ 'django.core.files.uploadhandler.TemporaryFileUploadHandler', ]
请记住,当您有大量同时上传的小型请求时,这并不是最有效的方法。