アップロードされたファイルは保存されず、代わりにそのテキストコンテンツが抽出されて表示される、FileFieldを含むフォームを作成するにはどうすればよいですか?
1 に答える
ドキュメント: http://docs.djangoproject.com/en/dev/topics/http/file-uploads/
短縮版:
- アップロード フォームには
forms.FileField
フィールドが必要です。 - フォームが送信されると、作成したビュー関数に移動する URL に移動します。そのビュー関数は
HttpRequest
(通常は という名前のrequest
) を取ります。 - からファイルを取得します
request.FILES[]
。
たとえば、フォームに次のものが含まれているとします。
upFile = forms.FileField
次に、ビューは次のファイルにアクセスできます。
def uploadView(request):
upFile = request.FILES["upFile"]
whereupFile
はUploadedFile
オブジェクトであり、ファイルのようなオブジェクトではありません。AnUploadedFile
には次のプロパティがあります。
name
: アップロードされたファイルの名前size
: バイト単位のサイズ
および次のメソッド:
read()
: ファイル全体を読み取り、文字列として返します。おそらくあなたには適していますが、2.5 MB を超えるファイルにはお勧めできません。multiple_chunks()
True
:ファイルを複数のチャンクとして処理する必要があるかどうかを返します。chunks()
: ファイル データを一度に 1 つのチャンクで返すジェネレータ (イテレータのように使用) を返します。
したがって、例を続けると、ファイルをディスクに保存したい場合は、次のように記述できます。
outFile = open("/tmp/uploadTest.txt", "w")
if not upFile.multiple_chunks():
outFile.write(upFile.read())
else:
for chunk in upFile.chunks():
outFile.write(chunk)
outFile.close()
あなたの場合、ページに 2.5 MB を超えるテキストを配置しようとしていない可能性があるため、エラー メッセージを表示して、multiple_chunks()
が返された場合はファイルを破棄することができます。True
編集:まあ、私が答えを書いている間にあなたの質問は完全に変わりました. したがって、ファイルの内容をページに配置する方法を詳しく説明し、ファイルが 2.5 MB を超えないと仮定すると、ビュー関数は次のようになります。
def uploadView(request):
upFile = request.FILES["upFile"]
context = {}
if upFile.multiple_chunks():
context["uploadError"] = "Uploaded file is too big (%.2f MB)." % (upFile.size,)
else:
context["uploadedFile"] = upFile.read()
return render_to_response('fileUploadPage.html', context)
もちろん、必要な他のビュー処理を追加します。
次に、fileUploadPage.html
テンプレートに次の場所が必要です。
<div id="uploaded">
{% if uploadError %}
<span class="error">{{ uploadError }}</span>
{% else %}
{{ uploadedFile }}
{% endif %}
</div>
編集 2: ドミニクには良い点があります。form
タグを正しく設定するための一般的なテンプレート コードを次に示します。次の形式のテンプレートでこれを使用します。
<form method="post" action="{% url uploadFile %}"
{% if form.is_multipart %}
enctype="multipart/form-data"
{% endif %}>
{{ form }}
</form>
あなたの場合、フォームにファイルが含まれていることがわかっているため、if
ブロックを失う可能性があります。
<form method="post" action="{% url uploadFile %}" enctype="multipart/form-data">
{{ form }}
</form>
注: この{% url ___ %}
コマンドは、ビューまたは名前付き URL の URL を入力します。パラメータは、urls.py
ファイルで使用されているビュー関数の名前か、次のurl
ようにオブジェクトに付けられた名前のいずれかです。
urlpatterns = patterns('',
url('^uploadform$', 'myapp.views.uploadFormView', name='uploadForm'),
url('^upload$', 'myapp.views.uploadView', name='uploadFile'),
# ...
)