2016-09-17 12 views
14

ユーザーにビデオをアップロードできるdjangoアプリがあります。 Heroku上でホストされ、アップロードされたファイルはS3バケットに格納されます。 私はJavaScriptを使用して、Djangoアプリケーションからの予約済み要求を取得した後、S3にファイルを直接アップロードしています。これは、Herokuの30秒のリクエストタイムアウトによるものです。 JavaScriptを使用せずにユーザーエクスペリエンスを損なうことなく、大規模なファイルをDjangoバックエンド経由でアップロードできる可能性はありますか?大規模なファイルをAWS S3にアップロードする30秒のリクエストタイムアウト無しにHeroku上でDjangoを使用する

+0

javascript用のAWS SDKを使用していますか?ユーザーエクスペリエンスは損なわれてはいけません。フロントエンドは、[フォトアルバム作成に関するAWS SDK for javascriptのドキュメント]に従って完全にカスタマイズ可能です(http://docs.aws.amazon.com/sdk-for- javascript/v2/developer-guide/s3-example-photo-album.html)。唯一の違いは、ビデオと写真をアップロードすることです。 また、なぜユーザーエクスペリエンスが損なわれたと思いますか?上記の問題は、技術的に効率的で正確な方法で費用対効果が最も高いと言えます。 – benson

+0

この記事はあなたのニーズをカバーし、非英雄的な環境にも有効だと思います。 https://devcenter.heroku.com/articles/s3-upload-python – wololoooo

答えて

5

問題の解決方法については、以下の点を考慮する必要があります。計算能力と帯域幅の両方の無駄があるS3に送信し、サーバーをDjangoのためにファイルを送信:

  • はなぜあなたのファイルをS3に行き、あなたのジャンゴ・サーバーに来るべきではありません。次に、あなたがs3ストレージに直接送ることができるときにファイルをdjangoサーバーに送る理由が次にあります。
  • UXを危険にさらすことなくファイルをs3にアップロードする方法:ファイルをdjangoサーバに送信することは、確かにオプションではないので、フロントエンド側でこれを処理する必要があります。しかし、フロントエンド側には限られたメモリのような独自の制限があります。非常に大きなファイルを扱うことはできません。すべてがRAMにロードされ、非常に大きなファイルの場合にはブラウザが最終的にメモリ不足になるからです。 dropzone.jsのようなものを使用することをお勧めします。メモリの問題は解決しませんが、プログレスバー、ファイル数などを表示するような良いUXをユーザーに提供できます。
+0

ブラウザからアップロードするとセキュリティ上のリスクが発生しますか?あなたは秘密キーとAPIキーが公開されることになりませんか? –

+0

それは確かに行いますが、ブラウザの場合には天気の良い証明書を使用する必要があります。これらの資格情報にはアクセスポリシーと有効期限があり、セキュリティ上の脅威にはなりません。それについての詳細は、aws S3 docs –

+0

にあります。その場合、ファイルを「ストリーミング」しないでしょうか?私はAWS JS SDKに慣れていないんだが、両方のアップロードおよびS3のハンドラは、ソケットとして扱うことができるならば、それはちょうど1からの読み込みや他への書き込みの場合となり、その後、両方 –

2

他の回答のポイントは有効です。 「JavaScriptを使用せずにDjangoバックエンドを使って大容量のファイルをアップロードすることができますか」という質問への短い答えは、「Herokuからの切り替えなし」であるということです。

ダイノスに送信されるデータはすべて、Herokuのルーティングメッシュを経由します。これは、独自の有限リソースを節約するために30秒の要求制限を適用するものです。任意の種類の長時間実行されるトランザクションは、他の要求を処理するために使用できる帯域幅/計算/などを使います。したがって、Herokuは何千ものダイノスを移動するのに役立つ制限を適用します。ファイルをアップロードするときは、まずクライアントの帯域幅によってサーバーに制約されます。次に、dynoとS3の間の帯域幅によって、dynoが実際に処理する処理の上に制約が課されます。

ファイルが大きいほど、特に信頼性の低いネットワーク上のクライアントの場合は、ステップ1で30秒のタイムアウトを超える可能性が高くなります。クライアントからS3へのダイレクトパスを作成することは合理的な妥協点です。