私は django を使用して 2 つの基本的なページを設計しています。1 つのページはファイルをメディアにアップロードするために使用され、もう 1 つのページはメディア フォルダーにアップロードされたすべてのファイルとそれらのファイルをダウンロードするためのリンクを一覧表示します。以下は私のコードです、
url.py
from django.conf.urls.defaults import *
from django.conf import settings
urlpatterns = patterns('',
url(r'^files$', 'learn_django.views.upload_file'),
url(r'^list_of_files$', 'learn_django.views.files_list'),
url(r'^download$', 'learn_django.views.download'),
)
if settings.DEBUG:
urlpatterns = patterns('',
url(r'^media/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT, 'show_indexes': True}),
) + urlpatterns
ビュー.py
from django.conf import settings
from django.shortcuts import render_to_response
from learn_django.forms import UploadFileForm
import os
def upload_file(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid() and form.is_multipart():
handle_uploaded_file(request.FILES['file'])
return HttpResponseRedirect('/files_list')
else:
form = UploadFileForm()
return render_to_response('files_form.html', {'form': form},context_instance=RequestContext(request))
def handle_uploaded_file(file,path=''):
filename = file._get_name()
destination_file = open('%s/%s' % (settings.MEDIA_ROOT, str(path) + str(filename)), 'wb+')
for chunk in file.chunks():
destination_file.write(chunk)
destination_file.close()
def files_list(request):
return render_to_response('files_list.html',{'total_files':os.listdir(settings.MEDIA_ROOT),'path':settings.MEDIA_ROOT},context_instance=RequestContext(request))
def download(request):
#do something to downlaod the files here.....
return something
files_list.html
<table border="1" colspan="2" width="100%">
<tr>
<th width="60%">File</td>
<th width="40%">Download</td>
</tr>
{% for file in total_files %}
<tr>
<td width="60%">{{file}}</td>
<td width="40%" align="center"><a href="/download" style="text-decoration:None">Download here</a></td>
</tr>
{% endfor %}
</table>
したがって、上記のコードでは、files
url でホームページにアクセスするfile_form.html
と、アップロード オプション付きのファイルを含むフォームがページに表示されるため、ファイルをアップロードすると、ファイルが正常files_list.html
にアップロードされ、アップロードされたリストを表示するページにリダイレクトされます。メディア ディレクトリ内のファイルと、その特定のファイルをダウンロードするための URL。
最後に、ページに示されているように、各ファイルの横にある表の形式のリンクをクリックすると、アップロードされたファイルがダウンロードされますfiles_list.html
。
リンクをクリックしたときに特定のアップロードされたファイルをダウンロードすることについてよくグーグル検索しましたが、見つからなかったので、SOに近づきました。
files_list.html
ページに表示されているアンカータグの概念を使用してメディアからファイルをダウンロードする方法を教えてください。
誰かがその特定のファイルをダウンロードするコードで私のビュー関数を埋めてくれると、より役に立ちます。そうすれば、download
実際に非常に速く学習できます......
編集済み
編集後、コードを次のように更新しました
url.py
以下の行を url conf に追加しました
url(r'^download/(?P<file_name>.+)$', 'learn_django.views.download'),
ダウンロードしたビュー機能を次のように編集しました
def download(request,file_name):
response = HttpResponse(mimetype='application/force-download')
response['Content-Disposition'] = 'attachment; filename=%s' % smart_str(file_name)
response['X-Sendfile'] = smart_str(settings.MEDIA_ROOT + file_name)
return response
そしてhtmlファイルのアンカータグは以下の通りです
<td width="40%" align="center"><a href="/download/{{file}}" style="text-decoration:None">Download here</a></td>
リンクをクリックdownload
すると、以下のエラーが表示されます
Request Method: GET
Request URL: http://localhost:8000/download
Django Version: 1.4.3
Exception Type: error
Exception Value:
unbalanced parenthesis
Exception Location: /usr/lib64/python2.7/re.py in _compile, line 245
Python Executable: /usr/bin/python