2017-07-04 57 views
1

多くの同じ質問を見ましたが、私の問題は解決していません ボタンを使用して私のビューで生成されたファイルをダウンロードしようとしています。xmlhttprequestを使用してボタンでdjangoのファイルをダウンロード

class dumpView(View): 

template_name = 'download.html' 
def get(self, request): 
    file = open("/home/test.pdf", "rwbt") 
    response = HttpResponse(file.read(), content_type="application/pdf") 
    response['Content-Disposition'] = 'attachement; filename=%s' % file 
    return render(request, 'download.html') 

マイURL:

url(r'^dump/', dumpView.as_view()), 

マイテンプレート:

{% extends 'base.html' %} 
{% load staticfiles %} 
{% block content %} 
<div class="container"> 
<div class="row"> 
    <div class="jumbotron"> 
     <div class="row"> 
      <center> 
       <a href="javascript:void(0)" class="btn btn-primary btn-lg dump">Download</a> 
      </center> 
     </div> 
    </div> 
</div> 
</div> 
{% endblock %} 
{% block javascript %} 
<script src="{% static 'js/home.js' %}"></script> 
{% endblock %} 

私のDjangoのビュー 問題:ダウンロードボタン

私の見解をクリックしながら、私は空のファイルを取得しますレスポンスをレンダリングしています。 UIのクラスダンプを持つボタンにクリックハンドラを追加して、 "/ dump" URLへのXHRリクエストを作成し、レスポンスをBLOBとして受け取り、カスタムの名前と日付でファイルをダウンロードしました。

マイJS:あなたのビューで

$(".dump").on("click", function() { 
xhttp = new XMLHttpRequest(); 
xhttp.onreadystatechange = function() { 
    var a, today; 
    if (xhttp.readyState === 4 && xhttp.status === 200) { 
     a = document.createElement('a'); 
     a.href = window.URL.createObjectURL(xhttp.response); 
     today = new Date(); 
     a.download = "file_" + today.toDateString().split(" ").join("_") + ".pdf"; 
     a.style.display = 'none'; 
     document.body.appendChild(a); 
     return a.click(); 
    } 
}; 
xhttp.open("GET", "/dump", true); 
xhttp.setRequestHeader("Content-Type", "application/json"); 
xhttp.responseType = 'blob'; 
xhttp.send(); 
}); 
+0

「レスポンス」varをどのように表示していますか? –

+0

私はテンプレートを使うことができるように私は応答を返しません。私はちょうど "返信応答"私は私のテンプレートので、テンプレートを持たないで直接ファイルをダウンロードすることができます。 –

答えて

1

に役立ちますかどうかを確認し、私は、@ボブ・vorkがちょうど言ったように、Content-Dispositionからのファイル名はすべきではないあなたの応答

content = file(filename).read() 
response = HttpResponse(content, content_type='text/plain') 
response['Content-Length'] = os.path.getsize(filename) 
response['Content-Disposition'] = 'attachment; filename=%s' % 'my_pdf.pdf' 

にサイズを追加することをお勧めPython fileオブジェクトですが、あなたの名前はダウンしています負荷があります。

どのようにしてJavaScript置き換えるurls.pyでビューの登録について:

<input type="button" value="Download" onclick="window.open('download_my_pdf')"> 

EDIT:へあなたが示唆したHTMLを行っているので

、その後、私が出してあげるの詳細を私の解決策。

まず、home.jsを削除できます。あなたが理解できるように

<a href="javascript:void(0)" class="btn btn-primary btn-lg dump">Download</a> 

<input type="button" value="Download" onclick="window.open('download_my_pdf')"> 

になり、あなたのviews.pyは直接だけでなく、右CONTENT_TYPEを置くためresponse

from django.http import HttpResponse 
from wsgiref.util import FileWrapper 

@login_required 
def download_pdf(request): 
    filename = 'whatever_in_absolute_path__or_not.pdf' 
    content = FileWrapper(filename) 
    response = HttpResponse(content, content_type='application/pdf') 
    response['Content-Length'] = os.path.getsize(filename) 
    response['Content-Disposition'] = 'attachment; filename=%s' % 'whatever_name_will_appear_in_download.pdf' 
    return response 

ご注意を返す必要があります。私はビュー(特にFileWrapper)をテストしていないことに注意してください、私はプレーンテキストのためにいくつかのコードを適用しました。このため、pdfをテキストファイルとして扱うと、TypeErrorが発生します。

URLです。py

urlpatterns = (
    [...] 
    url('download_my_pdf', download_pdf), 
) 
+0

答えてくれてありがとう、私は何を提案したのでしょうか? url: "url(r '^ dump /'、dumpView.as_view()、name = 'download_my_pdf')"ボタンを押しながらファイルをダウンロードできません。 –

+0

あなたが正しいと思うようにコンテンツとgetsize()を使用すると、TypeErrorが "Unicodeに強制変換されています:必要な文字列またはバッファ、ファイルが見つかりました" –

0

、あなたはattachment; filename=...としてContent-Dispositionを設定していますが、ファイルオブジェクトを追加します。私の推測では、ブラウザは適切な拡張子を持つファイル名が望ましいかもしれません。

私はDjangoプロジェクトで同様の見解を持っている、と私は同様に、ファイル名を引用していますが、それは

EDIT必要がある場合、私はわからない。また、「添付ファイル」のタイプミスがあります、余分な「E」を削除し、それはあなたのビューで

+0

あなたの答えをありがとうが、問題を解決しない、私はこれを試みた: "応答['Content-Disposition'] = '添付ファイル;ファイル名=%s'%test.pdf" Disposition '] ='添付ファイル;ファイル名=%s '%/home/test.pdf」ですが、空のファイルがあります。 –

+0

Ps:私はjsがレスポンスを返さないと思うのですが、レスポンスを返そうとしたときに、テンプレートやボタンなしでファイルを正常にダウンロードできます。 –

関連する問題