1. ホーム
  2. パイソン

[解決済み】Djangoにダウンロード可能なファイルを提供させる

2022-04-04 08:43:54

質問

サイト内のユーザーが、直接ダウンロードできないようにパスが隠されたファイルをダウンロードできるようにしたい。

例えば、次のようなURLにしてほしいのです。 http://example.com/download/?f=somefile.txt

また、サーバー上では、ダウンロード可能なファイルはすべて、フォルダー /home/user/files/ .

Django が、URL や View を見つけて表示しようとするのとは対照的に、そのファイルをダウンロードするために提供させる方法はありますか?

解決方法は?

S.Lottの解決策と、この解決策を組み合わせることができます。 xsendfileモジュール : django はファイルへのパス (またはファイルそのもの) を生成しますが、実際のファイル提供は Apache/Lighttpd によって処理されます。一旦 mod_xsendfile をセットアップすれば、ビューとの統合は数行のコードで済みます。

from django.utils.encoding import smart_str

response = HttpResponse(mimetype='application/force-download') # mimetype is replaced by content_type for django 1.7
response['Content-Disposition'] = 'attachment; filename=%s' % smart_str(file_name)
response['X-Sendfile'] = smart_str(path_to_file)
# It's usually a good idea to set the 'Content-Length' header too.
# You can also set any other required headers: Cache-Control, etc.
return response

もちろん、これはあなたがサーバをコントロールできる場合か、ホスティング会社が mod_xsendfile をすでにセットアップしている場合にのみ機能します。

EDITです。

mimetype は django 1.7 では content_type に置き換えられています。

response = HttpResponse(content_type='application/force-download')  

EDITです。 について nginx チェック これ を使用しています。 X-Accel-Redirect の代わりに apache X-Sendfileヘッダ。