2012-05-12 12 views
1

local filesystemから{{MEDIA_URL}}/uploadfolderに何らかのデータを含むテキストファイルをアップロードする必要があります。このファイルは、djangoのいずれかの関数で処理されます。ビュー。 javascriptとdjangoを使用してサーバーの一部のフォルダにテキストファイルをアップロードする

私はpage.Iは私が放火犯を使用

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

}); 

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

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

を試してみましたinput要素を使用して選択したテキストファイルであるFileオブジェクトを取得できました。このFileオブジェクトでdjangoビューを呼び出す方法は?djangoビューでは、このFileオブジェクトはどのデータ型ですか?

def storeAndProcessFile(request,file): 
    pass 

答えて

7

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を可能にしました。

+0

返信ありがとう... jqueryを使用して投稿を行い、djangoビューのリクエストからファイルを取得できるかどうか試します。ファイル多くのおかげで詳細な説明が特にあります – damon

+0

私はそれを単純なフォームでjavascriptなしで動作させることをお勧めします。そしてそれが動作したらjsを追加してください。 – miki725

関連する問題