Djangoでファイルダウンロード機能を実装する方法

php中世界最好的语言
リリース: 2018-04-11 17:17:14
オリジナル
3248 人が閲覧しました

今回は、Django で ファイルダウンロード 機能を実装する方法を説明します。Django でファイルダウンロード機能を実装するための 注意事項 について、実際のケースを見てみましょう。

Django 上に構築された Web サイトがファイルのダウンロード機能を提供する場合、最も簡単な方法は静的ファイルを Nginx に渡して処理することです。ただし、Web サイト自体のロジックにより、Django を介してダウンロード機能を提供する必要がある場合があります。 Django のページデータエクスポート機能(動的に生成されたファイルのダウンロード)、ファイルをダウンロードする前にユーザーの権限を確認するなど。そのため、Djangoでのファイルダウンロード機能の実装を検討する必要があります。

最も簡単なファイルダウンロード機能の実装

def file_download(request):
  # do something...
  with open('file_name.txt') as f:
    c = f.read()
  return HttpResponse(c)
ログイン後にコピー

のように、ファイル ストリームを HttpResponse オブジェクトに入れるだけです。 この方法はシンプルで粗雑で、小さなファイルをダウンロードするのに適していますが、ファイルが非常に大きい場合、この方法は大量のメモリを占有し、さらにはサーバーのクラッシュを引き起こす可能性があります

さらにリーズナブルなファイルダウンロード機能

Django の HttpResponse オブジェクトでは、イテレータをパラメータとして渡すことができます。上記のコードの受信パラメータ c をイテレータに置き換えることで、上記のダウンロード関数を最適化して、大きなファイルと小さなファイルの両方に適用できます。 HttpResponse オブジェクトの代わりに StreamingHttpResponse オブジェクトを使用することをお勧めします。StreamingHttpResponse オブジェクトは、HttpResponse オブジェクトと非常によく似ており、ファイルのダウンロード関数の場合は StreamingHttpResponse オブジェクトを使用するのが適切です。

したがって、より合理的なファイル ダウンロード関数では、まず ファイル処理 のイテレータを作成し、次にこのイテレータをパラメータとして StreaminghttpResponse オブジェクトに渡す必要があります (例:

from django.http import StreamingHttpResponse
def big_file_download(request):
  # do something...
 
  def file_iterator(file_name, chunk_size=512):
    with open(file_name) as f:
      while True:
        c = f.read(chunk_size)
        if c:
          yield c
        else:
          break
 
  the_file_name = "file_name.txt"
  response = StreamingHttpResponse(file_iterator(the_file_name))
 
  return response
ログイン後にコピー

)。 ファイルダウンロード機能が再度最適化されました

上記のコードは、ファイル ストリーミングを通じてサーバー上のファイルをブラウザに転送することを完了しました。ただし、ファイル ストリームは通常、ハードディスクにダウンロードされるのではなく、文字化けした形式で表示されます。そのため、いくつかの最適化を行う必要があります。ファイル ストリームをハードディスクに書き込みます。最適化は非常に簡単で、StreamingHttpResponse オブジェクトの Content-Type フィールドと Content-Disposition フィールドに次のような値を割り当てるだけです。 完全なコードは次のとおりです:

response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="test.pdf"'
ログイン後にコピー

特定のエクスポートファイル形式

Excelテーブルをエクスポート

1. まず、Excel テーブルを直接エクスポートします

まずエクスポートするデータを取得し、リスト形式で保存します。

その後、データは Excel に書き込まれ、ストリーミング方式でダウンロードするためにページに返されます。

りー

2. json ファイルをエクスポートします

json ファイルのエクスポートは Excel ほど面倒ではありません。json 形式のデータを結合するだけで済みますが、Web ページにエクスポートする場合は、ストリームを保存せずに直接返すことができます。ローカルは Excel をエクスポートするのが好きですか?

りー

3. 圧縮パッケージをエクスポートする

2 つのファイルをエクスポートすると両方を同時に返すことはできないため、2 つのファイルを 1 つのパッケージに入れてから、そのパッケージをストリームとして返すことを検討してください。

考える?このときエクスポートされるのは zip パッケージですが、この 2 つのファイル ストリームを zip パッケージに書き込むにはどうすればよいでしょうか。その後、上司の指導の下、パッケージ化するファイルをローカルに保存し、zip にパッケージ化した後、ローカル ファイルを削除し、zip ファイル ストリームを読み取り、応答に書き込み、zip に戻しました。ファイルストリーム。

from django.http import StreamingHttpResponse
def big_file_download(request):
  # do something... 
  def file_iterator(file_name, chunk_size=512):
    with open(file_name) as f:
      while True:
        c = f.read(chunk_size)
        if c:
          yield c
        else:
          break
 
  the_file_name = "big_file.pdf"
  response = StreamingHttpResponse(file_iterator(the_file_name))
  response['Content-Type'] = 'application/octet-stream'
  response['Content-Disposition'] = 'attachment;filename="{0}"'.format(the_file_name) 
  return response
ログイン後にコピー

この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。

推奨読書:

vue が xe-utils 関数ライブラリを使用する手順の詳細な説明


vue2.0 ルーティングにルータービューが表示されない場合の対処方法


How Native fetchを使用して画像アップロード機能を実装します


以上がDjangoでファイルダウンロード機能を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート