2013-05-25 20 views
35

私は、Railsアプリケーション、2-5Gbファイルで大きなファイルのアップロードを処理するさまざまなアプローチを理解することに興味があります。railsアプリケーションで大きなファイルのアップロードを処理する最良の方法は何ですか?

このサイズのファイルを転送するには、小さな部分に分割する必要があることを理解しています。私はいくつかの研究を行いました。

  • サーバー側の設定はanything over 4Gbを処理するための大規模なPOSTリクエストと、おそらく64ビットマシンに同意する必要があります。
  • AWSがサポートしていますmultipart upload.
  • HTML5 FileSystemAPIには、ファイルをチャンクでアップロードする永続アップロードがあります。 Bitorrentため
  • ライブラリこれは

理想的ではない、送信クライアントは、私がFTPを使用したくない理由は、私がウェブに残しておきたいということです、FTPのように、これらの方法のすべてを再開することができますが必要ですが、これが可能ならアプリ?私はcarrierwaveとpaperclipを使用していましたが、5Gbファイルのアップロードに時間がかかる可能性があるため、何かを探しています。

私が挙げたこれらのアプローチのうち、うまくいっていたことと、他に取り組んでいないものがあるとしたらどういうことでしょうか?可能であればプラグインはなく、JavaアプレットやFlashは使用しないでください。もう一つの懸念は、アップロード中にこれらのソリューションがファイルをメモリに保持するということです。これは、可能であれば避けたいという制約です。

答えて

34

私はいくつかのサイトでこの問題を扱ってきましたが、上に示したいくつかのテクニックとそうではないものがあります。良いニュースは、大量のアップロードを許可するのは実際はかなり現実的だということです。

多くのことは、ファイルをアップロードした後に実際にファイルを使用して計画していることによって異なります。ファイルに対する作業が多くなればなるほど、サーバーに近づけることができます。アップロード時に直ちに処理する必要がある場合は、純粋なレールソリューションを実行したいと思うかもしれません。処理を行う必要がない場合や、時間が重要でない場合は、「ハイブリッド」ソリューションを検討することができます。

信じられないかもしれませんが、実際にはmod_porter。 Mod_porterは、あなたのアプリケーションが通常行っている作業の多くをApacheにさせます。それは、アップロード中にスレッドとメモリの束を束縛しないように助けます。それは簡単な処理のためにあなたのアプリにローカルなファイルをもたらします。アップロードされたファイルを処理する方法(ストリームを考える)に注意を払うならば、伝統的にはかなり高価な操作であっても、プロセス全体がほとんどメモリを使わないようにすることができます。このアプローチでは、アプリケーションを実際にセットアップする必要はほとんどありません。実際のコードを変更する必要はありませんが、特定の環境(Apacheサーバー)とそれを設定する機能が必要です。

私はまたチャンクと再開可能なアップロードのような良いものをサポートするjQuery-File-Uploadを使って幸運を祈っています。 mod_porterのようなものがなければ、アップロード中に実行スレッド全体を結びつけることができますが、正しく実行されていれば、メモリ上でうまくいくはずです。これにより、「閉じる」ファイルとなり、その結果、処理が容易になります。このアプローチでは、実装するビューレイヤを調整する必要があり、すべてのブラウザで動作するわけではありません。

あなたは可能なオプションとしてFTPとビットトレントについて言及しました。これらは、あなたが考えているかもしれないオプションのように悪いことではありません。なぜなら、ファイルをサーバーのかなり近くに置くことができるからです。彼らは相互に排他的ではありません。あなたが指摘したように、アップロードマシンに存在してもいなくてもよい追加のクライアントが必要なので、いいです。これが動作する方法は、基本的には、アプリケーションに表示される領域にダンプするための領域を設定します。次に、処理を行う必要がある場合は、cronジョブ(または何でも)を実行してアップロードのためにその場所を監視し、サーバーの処理方法をトリガーします。これは、上記の方法が提供できる即時の応答を得ることはありませんが、間隔をかなり小さくするように設定することができます。この方法の唯一の利点は、使用されるプロトコルが大きなファイルを転送するのに適していることです。追加のクライアント要件と断片化されたプロセスは、通常、私の経験上、その利点を上回ります。

処理を一切必要としない場合は、単純にそのままS3に進んでください。このソリューションは、静的資産としてサーバー以外のファイルで実際に何かを行う必要がある秒後に落ちます....

私はレールアプリケーションでHTML5 FileSystemAPIを使用している経験がありませんその点まで話してください。ただし、あなたがサポートできるクライアントは大幅に制限されているようです。

残念ながら、本当の銀色の弾丸はありません。あなたが達成しようとしていることのコンテキストで、これらのオプションをすべてあなたの環境に照らして評価する必要があります。たとえば、Webサーバーを構成したり、ローカルファイルシステムに永続的に書き込むことができない場合があります。 jQuery-File-Uploadは、アプリケーションにとって本当に変更が必要なだけなので、おそらくほとんどの環境で最善の策だと思うので、実装を別の環境に最も簡単に移すことができます。

1

私はレールサーバーをバイパスし、大きなファイル(チャンクに分割)を直接ブラウザからAmazon Simple Storageに投稿します。 JavaScriptを使ってファイルを分割する場合はpostをご覧ください。私はちょっと好奇心が強いので、このセットアップがどのようにパフォーマンスになりますか、今週末この設定で微妙な感じがします。

+0

使用amazon.haveは一度それを試してみたときのパフォーマンスの問題のビットです – Catmandu

1

をうまくいかない場合は私に知らせてください私はBrad Werthが答えを釘付けにしたと思う。

ただ1つのアプローチをS3に直接アップロードすることができます(理論的にaws lambdaを使ってアプリに通知することができた後でも再処理が必要な場合でも... bu tは私はちょうどここに推測している正直に言うと、私はあなたが使用している場合

http://aws.amazon.com/articles/1434

)この後の上で展開するだろう、自分で同じ問題を解決しようと思いcarrierwave

1

このプロジェクトは、大きなファイルの再開可能なアップロードをサポートするために、HTTP経由の新しいプロトコルです。独自のサーバを提供することでRailsをバイパスします。eabharam..There @

http://tus.io/

関連する問題