web-dev-qa-db-ja.com

Djangoダウンロードファイルの提供

いくつかのコンテンツで生成されたtxtファイルを提供しようとしていますが、いくつか問題があります。一時ファイルを作成し、NamedTemporaryFileを使用してコンテンツを書き込み、削除をfalseに設定してデバッグしましたが、ダウンロードしたファイルには何も含まれていません。

私の推測では、応答値が正しいファイルを指していないため、何もダウンロードされていません。コードは次のとおりです。

    f = NamedTemporaryFile()
    f.write(p.body)

    response = HttpResponse(FileWrapper(f), mimetype='application/force-download')
    response['Content-Disposition'] = 'attachment; filename=test-%s.txt' % p.uuid
    response['X-Sendfile'] = f.name
13
Callum

次のように、responseを介してp.bodyを送信することを検討しましたか。

response = HttpResponse(mimetype='text/plain')
response['Content-Disposition'] = 'attachment; filename="%s.txt"' % p.uuid
response.write(p.body)
20
Ric

XSendには、response['X-Sendfile']内のファイルへのパスが必要です。したがって、次のことができます。

response['X-Sendfile'] = smart_str(path_to_file)

ここで、path_to_fileはファイルへのフルパスです(ファイルの名前だけではありません)これをチェックアウトしてください Django-snippet

3
karthikr
import urllib2;   
url ="http://chart.apis.google.com/chart?cht=qr&chs=300x300&chl=s&chld=H|0"; 
opener = urllib2.urlopen(url);  
mimetype = "application/octet-stream"
response = HttpResponse(opener.read(), mimetype=mimetype)
response["Content-Disposition"]= "attachment; filename=aktel.png"
return response 

あなたのアプローチにはいくつかの問題がある可能性があります。

  • ファイルの内容をフラッシュする必要はありません。上記のコメントに記載されているように、f.flush()を追加してください。
  • NamedTemporaryFileは閉じると削除されます。関数を終了すると同時に何が起こる可能性があるため、Webサーバーはそれを取得する機会がありません。
  • 一時ファイル名が、WebサーバーがX-Sendfileを使用して送信するように構成されているパスから外れている可能性があります

一時ファイルとX-Sendfile ..を作成する代わりに、 StreamingHttpResponse を使用する方がよいかもしれません。

1
Michal Čihař