AJAXを介してファイルを事前にアップロードするHTMLフォームがあります。したがって、djangoバックエンドには、このAJAX呼び出しを処理する次のViewコードがあります。
@csrf_exempt
def book_upload(request):
if request.method == 'POST':
log.info('received POST to main book_upload view')
if request.FILES is None:
return HttpResponseBadRequest('Must have files attached!')
log.info('request has FILES')
file_types = (u'file_pdf', u'file_djvu', u'file_doc', u'file_epub', u'file_djvu', u'file_fb2', u'file_txt', u'file_chm', u'file_other');
file = None
file_type = None
for ft in file_types:
if ft in request.FILES:
file = request.FILES[ft]
file_type = ft
break
if file is None:
return HttpResponseBadRequest('Bad file type')
file_path = file.temporary_file_path()
result = {"path": file_path, "format": file_type}
response_data = simplejson.dumps(result)
if "application/json" in request.META['HTTP_ACCEPT_ENCODING']:
mimetype = 'application/json'
else:
mimetype = 'text/plain'
return HttpResponse(response_data, mimetype=mimetype)
else:
return HttpResponse('Only POST accepted')
しかし、このコードには問題があります。2.5 mbを超えるファイルで機能します(ファイルサイズよりもTemporaryUploadedFileがデフォルト設定で> 2.5 mbであるため)。したがって、このコードは、request.FILESにTemporaryUploadedFileタイプのオブジェクトが含まれているという考えに基づいています。しかし、場合によっては、サイズが2.5mb未満のファイルを受け取ります。また、request.FILESにはInMemoryUploadedFileが含まれています。
だから、私は次のことをしたいです-ajaxを介してアップロードされた各ファイルは一時的に保存する必要があります。そして、メモリはそれを行うのに適した場所ではありません-最終的な復元ファイル(フォーム送信後)には、メモリ内のこのファイルに関する情報がないためです。したがって、タスクはInMemoryUploadedFileをTemporaryUploadedFileに「変換」することです-それは可能ですか?
PS
たぶん、InMemoryUploadedFileオブジェクトからファイルの内容を読み取り、それを手動でディスクに書き込む必要があります(たとえば、/ tmpディレクトリに)。あなたはどのように思いますか?
PPS
そしてもう1つの質問-一時ディレクトリに事前にアップロードするのは良い考えですか?:)私の場合、フォームには6つのinput [type = file]要素があり、それぞれが異なるファイルタイプをアップロードします(6つはUIのニーズに対応します)。
TIA!