JavaScriptを使用する前に、まずDjangoを使用してファイルをアップロードおよび処理する方法を理解する必要があります。以下のHTMLフォームを考えてみましょう:ユーザーがクリックボタンを提出する際に
<form method="post" action="/foo/url/">
<input type="file" name="foofile">
<input type="submit" value="Upload">
</form>
ので、ブラウザはHTTPメソッドPOST
を使用して/foo/url/
にそのファイルをアップロードします。 Djangoのサーバー側では、URL /foo/url/
がいくつかのビューにマップされます。あなたの場合はstoreAndProcessFile
になります。そのため、ビューが実行する必要があるのは、アップロードされたファイルを取り出し、それをディスク(またはおそらく他のストレージシステム)に保存することです。
このビューでは、質問に表示されているように、関数のパラメータの1つとしてファイルが取得されません。これは、GET、POST、およびFILEデータがHTTPリクエストでどのように受け渡されるかによって発生します。したがって、ファイルは実際にはビュー内のrequest
パラメータの一部になります。あなたはrequest.FILES['foofile']
でファイルを参照することができます。このコードは、Djangoのドキュメントのうちのほとんどである
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')
:
だけのディスクにファイルを保存するには、あなたのビューは次のようになります。詳細を知りたい場合は、hereを読むことができます。
Javascriptに関しては、ajaxや複数のファイルを一度にアップロードできるjQueryプラグインが大量にあります。私は本当にthisライブラリが好きです。それは複数のファイルを送ることを含む多くの機能を持っています。しかし、あまりにも多くの場合は、jQueryファイルのアップロードプラグインの検索を行うことができますし、それらのトンがありますが、私は最近他の誰もテストしていないので、任意の推奨を与えることはできません。
しかし、CSRFであるDjangoサイトにajaxリクエストを行う際には、注意すべき点が1つあります。 Django 1.2.5以降、CSRFがどのように検証され、多くのアップロードライブラリが壊れる可能性があるかを変更しました。あなたはそれを心配する必要がない場合は、常にcsrf_exempt
デコレータを追加することができます:あなたはCSRFを必要としますが、CSRFとjQueryのファイルアップローダーを統合するサンプル実装を見てとることができた場合は
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def storeAndProcessFile(request):
...
をhereを可能にしました。
返信ありがとう... jqueryを使用して投稿を行い、djangoビューのリクエストからファイルを取得できるかどうか試します。ファイル多くのおかげで詳細な説明が特にあります – damon
私はそれを単純なフォームでjavascriptなしで動作させることをお勧めします。そしてそれが動作したらjsを追加してください。 – miki725