私はいくつかのサイトでこの問題を扱ってきましたが、上に示したいくつかのテクニックとそうではないものがあります。良いニュースは、大量のアップロードを許可するのは実際はかなり現実的だということです。
多くのことは、ファイルをアップロードした後に実際にファイルを使用して計画していることによって異なります。ファイルに対する作業が多くなればなるほど、サーバーに近づけることができます。アップロード時に直ちに処理する必要がある場合は、純粋なレールソリューションを実行したいと思うかもしれません。処理を行う必要がない場合や、時間が重要でない場合は、「ハイブリッド」ソリューションを検討することができます。
信じられないかもしれませんが、実際にはmod_porter。 Mod_porterは、あなたのアプリケーションが通常行っている作業の多くをApacheにさせます。それは、アップロード中にスレッドとメモリの束を束縛しないように助けます。それは簡単な処理のためにあなたのアプリにローカルなファイルをもたらします。アップロードされたファイルを処理する方法(ストリームを考える)に注意を払うならば、伝統的にはかなり高価な操作であっても、プロセス全体がほとんどメモリを使わないようにすることができます。このアプローチでは、アプリケーションを実際にセットアップする必要はほとんどありません。実際のコードを変更する必要はありませんが、特定の環境(Apacheサーバー)とそれを設定する機能が必要です。
私はまたチャンクと再開可能なアップロードのような良いものをサポートするjQuery-File-Uploadを使って幸運を祈っています。 mod_porterのようなものがなければ、アップロード中に実行スレッド全体を結びつけることができますが、正しく実行されていれば、メモリ上でうまくいくはずです。これにより、「閉じる」ファイルとなり、その結果、処理が容易になります。このアプローチでは、実装するビューレイヤを調整する必要があり、すべてのブラウザで動作するわけではありません。
あなたは可能なオプションとしてFTPとビットトレントについて言及しました。これらは、あなたが考えているかもしれないオプションのように悪いことではありません。なぜなら、ファイルをサーバーのかなり近くに置くことができるからです。彼らは相互に排他的ではありません。あなたが指摘したように、アップロードマシンに存在してもいなくてもよい追加のクライアントが必要なので、いいです。これが動作する方法は、基本的には、アプリケーションに表示される領域にダンプするための領域を設定します。次に、処理を行う必要がある場合は、cronジョブ(または何でも)を実行してアップロードのためにその場所を監視し、サーバーの処理方法をトリガーします。これは、上記の方法が提供できる即時の応答を得ることはありませんが、間隔をかなり小さくするように設定することができます。この方法の唯一の利点は、使用されるプロトコルが大きなファイルを転送するのに適していることです。追加のクライアント要件と断片化されたプロセスは、通常、私の経験上、その利点を上回ります。
処理を一切必要としない場合は、単純にそのままS3に進んでください。このソリューションは、静的資産としてサーバー以外のファイルで実際に何かを行う必要がある秒後に落ちます....
私はレールアプリケーションでHTML5 FileSystemAPIを使用している経験がありませんその点まで話してください。ただし、あなたがサポートできるクライアントは大幅に制限されているようです。
残念ながら、本当の銀色の弾丸はありません。あなたが達成しようとしていることのコンテキストで、これらのオプションをすべてあなたの環境に照らして評価する必要があります。たとえば、Webサーバーを構成したり、ローカルファイルシステムに永続的に書き込むことができない場合があります。 jQuery-File-Uploadは、アプリケーションにとって本当に変更が必要なだけなので、おそらくほとんどの環境で最善の策だと思うので、実装を別の環境に最も簡単に移すことができます。
使用amazon.haveは一度それを試してみたときのパフォーマンスの問題のビットです – Catmandu