如何在 Django 中上传后访问文件?
How to access file after upload in Django?
我正在从事网络工作。 User
可以上传一个文件。此文件采用 docx
格式。在他上传文件并选择要将文件翻译成哪种语言后,我想将他重定向到另一个页面,他可以在其中查看翻译价格。价格取决于特定语言和 docx
文件中的字符数。
我不知道如何处理上传的文件。我有一个获取文件路径和 returns 多个字符的函数。上传文件并点击提交后,我想调用这个函数,这样我就可以用估计的价格呈现新页面。
我读到我可以在 request.FILES['file']
上调用 temporary_file_path
但它引发了
'InMemoryUploadedFile' object has no attribute '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)
InMemoryUploadedFile
没有提供temporary_file_path
。内容存在 'in memory' - 正如 class 名称所暗示的那样。
默认情况下,Django 对最大 2.5MB 的文件使用 InMemoryUploadedFile
,更大的文件使用 TemporaryFileUploadHandler
。后者提供了相关的 temporary_file_path
方法。 Django Documentation
所以一个简单的方法是将 FILE_UPLOAD_HANDLERS 的设置更改为始终使用 TemporaryFileUploadHandler
:
FILE_UPLOAD_HANDLERS = [
'django.core.files.uploadhandler.TemporaryFileUploadHandler',
]
请记住,当您的网站有很多 并发的小型上传请求时,这不是最有效的方法。
我正在从事网络工作。 User
可以上传一个文件。此文件采用 docx
格式。在他上传文件并选择要将文件翻译成哪种语言后,我想将他重定向到另一个页面,他可以在其中查看翻译价格。价格取决于特定语言和 docx
文件中的字符数。
我不知道如何处理上传的文件。我有一个获取文件路径和 returns 多个字符的函数。上传文件并点击提交后,我想调用这个函数,这样我就可以用估计的价格呈现新页面。
我读到我可以在 request.FILES['file']
上调用 temporary_file_path
但它引发了
'InMemoryUploadedFile' object has no attribute '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)
InMemoryUploadedFile
没有提供temporary_file_path
。内容存在 'in memory' - 正如 class 名称所暗示的那样。
默认情况下,Django 对最大 2.5MB 的文件使用 InMemoryUploadedFile
,更大的文件使用 TemporaryFileUploadHandler
。后者提供了相关的 temporary_file_path
方法。 Django Documentation
所以一个简单的方法是将 FILE_UPLOAD_HANDLERS 的设置更改为始终使用 TemporaryFileUploadHandler
:
FILE_UPLOAD_HANDLERS = [
'django.core.files.uploadhandler.TemporaryFileUploadHandler',
]
请记住,当您的网站有很多 并发的小型上传请求时,这不是最有效的方法。