今回は、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 サイトの他の関連記事を参照してください。