JavaScript について説明する前に、Django を使用してファイルが一般的にどのようにアップロードおよび処理されるかを理解する必要があります。次の html フォームを検討してください。
<form method="post" action="/foo/url/">
<input type="file" name="foofile">
<input type="submit" value="Upload">
</form>
したがって、ユーザーが送信ボタンをクリックすると、ブラウザはそのファイルを/foo/url/
using HTTP メソッドにアップロードしますPOST
。次に、Django のサーバー側で、URL/foo/url/
が何らかのビューにマップされます。あなたの場合は になりますstoreAndProcessFile
。したがって、ビューが行う必要があるのは、アップロードされたファイルを取得して、それをディスク (または他のストレージ システム) に保存することです。
質問で示したように、ビューはファイルを関数パラメーターの1つとして取得しません。これは、GET、POST、および FILE データが HTTP 要求でどのように渡されるかによるものです。したがって、ファイルは実際にrequest
はビュー内のパラメーターの一部になります。でファイルを参照できますrequest.FILES['foofile']
。
ファイルをディスクに保存するだけの場合、ビューは次のようになります。
def storeAndProcessFile(request):
# make sure the the request method is POST
if request.method != 'POST':
return HttpResponseBadRequest('Only POST requests are allowed')
# now get the uploaded file
file = request.FILES['foofile']
# the file is going to be an instance of UploadedFile
with open('/destination/path/%s' % file.name, 'wb+') as dest:
for chunk in file.chunks():
dest.write(chunk)
# return success message
return HttpResponse('File uploaded')
このコードは、Django のドキュメントからほとんど外れています。詳細を知りたい場合は、ここで読むことができます。
Javascriptに関しては、ajaxを使用してファイルをアップロードしたり、一度に複数のファイルをアップロードしたりできるjQueryプラグインがたくさんあります. 私はこの図書館がとても好きです。複数のファイルを送信するなど、多くの機能があります。ただし、それが多すぎる場合は、jQueryファイルアップロードプラグインを検索するだけで、たくさんありますが、最近他のプラグインをテストしていないため、推奨することはできません.
ただし、Django サイトに ajax リクエストを行う際に注意すべき点が 1 つあります。それは CSRF です。Django 1.2.5 以降、CSRF の検証方法が変更され、多くのアップロード ライブラリが壊れる可能性があります。心配する必要がない場合は、いつでもcsrf_exempt
デコレータを追加できます。
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def storeAndProcessFile(request):
...
ただし、CSRF が必要な場合は、CSRF を有効にして jQuery ファイル アップローダーを統合するサンプル実装をこちらで確認できます。