2016-11-10 8 views
0

ユーザがそれを押すと、Djangoのメディアフォルダからユーザマシンにpdfファイルをダウンロードするリンクを作成します。HTMLファイルのHTTPリンクを使ってDjangoのFileFieldからファイルをダウンロードする

私はさまざまな方法を試みましたが、すべてが間違っていました。ファイルが見つからないか、コードが実行されていてもファイルが破損していることがわかります。

私のHTMLリンク:

<td> <a href="/download/">Download</a></td> 

私のURLパターンがビューにリンクします。

url(r'^download/$', views.DownloadPdf), 

私のFileFieldにはこのようなものです:スニペットコードに続いて

​​

は、そのビューであります破損したpdfをダウンロード:

def DownloadPdf(request): 

filename = '/home/USER/PycharmProjects/MyProject/media/Invoice_Template.pdf' 
response = HttpResponse(content_type='application/pdf') 
fileformat = "pdf" 
response['Content-Disposition'] = 'attachment; 
filename=thisismypdf'.format(fileformat) 
return response 

私はそれを機能させるために何をしなければなりませんか?

+0

あなたがして、あなたの 'media'フォルダを果たす必要がありますあなたはウェブサーバーです。開発時に開発サーバーがこの作業を行います。詳細はhttps://docs.djangoproject.com/en/1.10/howto/static-files/を参照してください。 –

答えて

0
with open(os.path.join(settings.MEDIA_ROOT, 'Invoice_Template.pdf'), 'rb') as fh: 
    response = HttpResponse(fh.read(), content_type="application/pdf") 
    response['Content-Disposition'] = 'attachment; filename=invoice.pdf' 
    return response 
+0

これはすべてをメモリに読み込みます.FileResponseを使用するか、Webサーバーがそれを送信するようにしてください。 – RemcoGerlich

+0

@RemcoGerlichはい、あなたは正しいですが、私はVios Lkが最初は簡単なことを理解しなければならないと思います。 –

0

@Sergey Gornostaevのコードは完璧に動作しますが、それはdifferect方法でaproachですので、私は私のコードの下に掲載します。

私は少し私のコード修正:

def DownloadPdf(request): 
    path_to_file = '/home/USER/PycharmProjects/MyProject/media /Invoice_Template.pdf' 
    f = open(path_to_file, 'r') 
    myfile = File(f) 
    response = HttpResponse(myfile, content_type='application/pdf') 
    response['Content-Disposition'] = 'attachment; filename=filename' 
    return response 

しかし、唯一のPDFファイルには、(TXTファイルで動作します)私にそのエラーを与える:

'utf-8' codec can't decode byte 0xe2 in position 10

+0

ファイルをテキストとして開くが、pdfはバイナリなので、 'open'で 'r'を 'rb'に変更してください。 –

+0

それも動作します!このすべてを理解するために私を助けてください。 thnx man。 –

関連する問題