ValumnsFileUploaderを使用してファイルをdjangoにロードしています。これは、最新のブラウザーではajaxアップロードをサポートし、XHR
IEなどの古いブラウザーではiFrameフォールバックをサポートします。
ここで問題が発生します。大きなファイルをアップロードすると、iFrameアップロードのみが機能します。これは、ファイルがマップされrequest.FILES
、djangoがメモリではなくディスクにすぐに書き込むためです。
アップロードを使用する場合XHR
、request._raw_post_dataを読み取り、これをディスクに書き込む必要がありますが、。で失敗しますMemoryError
。
これは私のファイルアップローダーの初期化です:
var uploader = new qq.FileUploader({
'action': uploadUrl,
'multiple': true,
'allowedExtensions': allowedExtensions,
'element': selector,
'debug': true,
'onComplete': completeFunction,
'onProgress': progressFunction,
'onSubmit': submitFunction
});
djangoの最後で、次のコードを使用してファイルの内容をディスクに書き込みます。
# open a new file to write the contents into
new_file_name = str(uuid.uuid4())
destination = open(upload_path + new_file_name, 'wb+')
# differentiate between xhr (Chrome, FF) and pseudo form uploads (IE)
if len(request.FILES) > 0: # IE
for chunk in request.FILES[0].chunks():
destination.write(chunk)
else: # others
destination.write(request._raw_post_data)
destination.close()
Alex Kuhlからこのソリューションも試しましたが、これはで失敗しますIOError: request data read error
。
XHR
を介してファイルをアップロードしrequest.FILES
、djangoの組み込み処理を使用する方法はありますか?