ダウンロード
Djangoのベースのウェブサイトは、ファイルのダウンロード機能を提供するために設立場合により、サイト自体のロジックに、時には静的nginxのと、他の治療にドキュメントが、より最も簡単な方法は、そのようなページデータのエクスポート機能としてジャンゴによってダウンロード機能を提供する必要性(ダウンロード動的に生成されるファイル)、ファイルをダウンロードするためのユーザー権限を確認。そのため、ファイルのダウンロード機能でジャンゴで実装されて見ることが必要です。
最も単純なファイルのダウンロード機能を実現するために、
このようなHttpResponseオブジェクトへのファイルストリーム、:
デフfile_download(リクエスト): #何かを... Fとしてオープン( 'file_name.txt')を持ちます: C = f.read() (C)はHttpResponseを返します
このようにシンプルで、粗、小さなファイルをダウンロードするのに適したが、ファイルが非常に大きい場合、この方法は大量のメモリを取る、あるいはサーバーをクラッシュします。
もっと合理的なファイルのダウンロード
DjangoのはHttpResponseオブジェクトがパラメータとして渡されたイテレータ、イテレータに渡さCパラメータ上記のコードは、あなたが上記のドキュメントのサイズに合わせて最適化ダウンロードすることができます許可適しており;とDjangoさらに推奨StreamingHttpResponseオブジェクトのHttpResponseを交換するオブジェクトは、StreamingHttpResponseオブジェクトは、ブラウザに送信されたファイルをストリーミングするために使用され、のHttpResponseをオブジェクトがStreamingHttpResponseがより合理的なオブジェクトを使用して、ファイルのダウンロード機能と非常に似ています。
そのため、より合理的なファイルのダウンロード機能は、ファイルを処理するためのイテレータを書き、その後、パラメータとしてイテレータStreaminghttpResponseオブジェクトに渡さなければならない、など:
django.http輸入StreamingHttpResponseから デフbig_file_download(リクエスト): #何かを... DEF file_iterator(FILE_NAME、CHUNK_SIZE = 512)。 Fとしてオープン(FILE_NAME)を持ちます: 真の中に: C = f.read(CHUNK_SIZE) Cの場合: 降伏C 他: ブレーク the_file_name = "file_name.txt" 応答= StreamingHttpResponse(file_iterator(the_file_name)) リターン応答
ファイルのダウンロードの最適化を再度
上記のコードは、ファイルストリームを介してブラウザにストリーミングサーバ上のファイルを、完了しましたが、ファイルストリームは、一般的ではなく、ハードドライブにダウンロードするよりも、文字化け形式でブラウザに表示され、そのため、私たちは最適化で何かをしなければなりません、ディスクに書き込まれたストリームファイルをしましょう。最適化は、Content-Typeフィールドは非常にシンプルで、次の値へのContent-処分StreamingHttpResponseの対象は、割り当てることができ、例えば:
応答[ 'Content-Typeの'] = 'アプリケーション/オクテットストリーム' 応答[ 'のContent-処分'] = '添付ファイル;ファイル名= "test.pdfという"'
次のように完全なコードは次のとおりです。
django.http輸入StreamingHttpResponseから デフbig_file_download(リクエスト): #何かを... DEF file_iterator(FILE_NAME、CHUNK_SIZE = 512)。 Fとしてオープン(FILE_NAME)を持ちます: 真の中に: C = f.read(CHUNK_SIZE) Cの場合: 降伏C 他: ブレーク the_file_name = "big_file.pdf" 応答= StreamingHttpResponse(file_iterator(the_file_name)) 応答[ 'Content-Typeの'] = 'アプリケーション/オクテットストリーム' 応答[ 'コンテンツの廃棄'] = 'アタッチメント;ファイル名= "{0}"' フォーマット(the_file_name) リターン応答