2

local filesystemから言うと、いくつかのデータを含むテキストファイルをアップロードする必要があり{{MEDIA_URL}}/uploadfolderます。このファイルは、私のビューの関数の1つによって処理されdjangoます。

<input type="file" id="fselect" >以下のようにアップロード機能を呼び出そうとしたJavaScriptファイルを作成しました。

 $(document).ready(function(){
      ...
      $('#fselect').change(function(){ 
         file=$('#fselect').get(0).files[0];
         uploadFile(file);
      }

});

私がfirebugを使って試したとき

file=$('#fselect').get(0).files[0]

入力要素を使用して選択したテキスト ファイルである File オブジェクトを取得できました。この File オブジェクトを使用して Django ビューを呼び出すにはどうすればよいですか? Django ビューでは、この File オブジェクトはどのようなデータ型になりますか?

def storeAndProcessFile(request,file):
    pass
4

1 に答える 1

10

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 ファイル アップローダーを統合するサンプル実装をこちらで確認できます。

于 2012-05-12T06:03:19.557 に答える