Djangoは大きなファイルのアップロードとダウンロードを使用して

 

ダウンロード

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)

  リターン応答

  

 

おすすめ

転載: www.cnblogs.com/lice-blog/p/11652555.html
おすすめ