2016-04-03 11 views
7

Djangoを使い始めたばかりで、ユーザーが多数のExcelファイルをアップロードできるWebサイトを開発しようとしています。これらのファイルはメディアフォルダに保存されますWebプロジェクト/プロジェクト/メディア。Djangoファイルをダウンロードする

def upload(request): 
    if request.POST: 
     form = FileForm(request.POST, request.FILES) 
     if form.is_valid(): 
      form.save() 
      return render_to_response('project/upload_successful.html') 
    else: 
     form = FileForm() 
    args = {} 
    args.update(csrf(request)) 
    args['form'] = form 

    return render_to_response('project/create.html', args) 

文書は、あなたがにクリックすることができ、それは彼らと彼らがアップロードしたexcelfileの名前についての基本的な情報を表示します、彼らがアップロードした他の書類と一緒に一覧に表示されます。ここから私は同じリンクを使用して再度ファイルをエクセルダウンロードできるようにしたい:

<a href="/project/download"> Download Document </a> 

)私のURLが

urlpatterns = [ 

       url(r'^$', ListView.as_view(queryset=Post.objects.all().order_by("-date")[:25], 
              template_name="project/project.html")), 
       url(r'^(?P<pk>\d+)$', DetailView.as_view(model=Post, template_name="project/post.html")), 
       url(r'^upload/$', upload), 
       url(r'^download/(?P<path>.*)$', serve, {'document root': settings.MEDIA_ROOT}), 

      ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

ですが、私は(エラーを取得し、サーブ予想外のキーワード引数」を得ましたドキュメントルート '。誰もがこれを修正する方法を説明することはできますか?

OR

私がアップロードしたファイルを選択し、あなたが引数文書_ルートにアンダースコアを逃した

def download(request): 
    file_name = #get the filename of desired excel file 
    path_to_file = #get the path of desired excel file 
    response = HttpResponse(mimetype='application/force-download') 
    response['Content-Disposition'] = 'attachment; filename=%s' % smart_str(file_name) 
    response['X-Sendfile'] = smart_str(path_to_file) 
    return response 
+1

'serve'ビューのコードを含めることはできますか? – xthestreams

答えて

21

を使用して提供されるようにするために得ることができる方法を説明してください。しかし、生産中にserveを使用することは悪い考えです。代わりに次のようなものを使用してください:

import os 
from django.conf import settings 
from django.http import HttpResponse 

def download(request, path): 
    file_path = os.path.join(settings.MEDIA_ROOT, path) 
    if os.path.exists(file_path): 
     with open(file_path, 'rb') as fh: 
      response = HttpResponse(fh.read(), content_type="application/vnd.ms-excel") 
      response['Content-Disposition'] = 'inline; filename=' + os.path.basename(file_path) 
      return response 
    raise Http404 
+0

うまくいった。ありがとうございます – jsm1th

+0

それは私のためにスムーズに動作します。 thx @ Sergey Gornostaev – gustav

関連する問題