43

Rails アプリケーションで大きなファイルのアップロード (2 ~ 5Gb ファイル) を処理するためのさまざまなアプローチを理解することに興味があります。

このサイズのファイルを転送するには、ファイルを小さなパーツに分割する必要があることを理解しています。

これらのメソッドはすべて FTP のように再開できますか? FTP を使用したくない理由は、可能であれば Web アプリに保持したいからです。Carrierwave と paperclip を使用しましたが、5Gb ファイルのアップロードには時間がかかる可能性があるため、再開できるものを探しています!

私がリストしたこれらのアプローチのうち、何がうまく機能したかを理解したいと思います。可能であればプラグインは使用せず、むしろ Java アプレットまたは Flash を使用しないようにします。もう 1 つの懸念は、これらのソリューションがアップロード中にファイルをメモリに保持することです。これも、可能であれば避けたい制約です。

4

6 に答える 6

35

私はいくつかのサイトでこの問題に対処してきましたが、上で説明したいくつかのテクニックと、そうでないいくつかのテクニックを使用しています。幸いなことに、大規模なアップロードを許可することは、実際にはかなり現実的です。

これの多くは、ファイルをアップロードした後に実際に何をする予定かによって異なります...ファイルに対して行う作業が増えるほど、ファイルをサーバーに近づけたいと思うようになります。アップロード時にすぐに処理を行う必要がある場合は、おそらく純粋な Rails ソリューションを使用することをお勧めします。処理を行う必要がない場合、または時間が重要でない場合は、「ハイブリッド」ソリューションの検討を開始できます...

信じられないかもしれませんが、 mod_porterを使用するだけでかなり幸運に恵まれました。Mod_porter は、アプリが通常行う多くの作業を apache に実行させます。アップロード中にスレッドと大量のメモリを拘束しないようにするのに役立ちます。簡単に処理できるように、アプリに対してローカルなファイルが生成されます。アップロードされたファイル (ストリームを考えてください) を処理する方法に注意を払えば、従来はかなりコストのかかる操作であっても、プロセス全体でメモリをほとんど使用しないようにすることができます。このアプローチでは、アプリを機能させるために実際にセットアップする必要はほとんどなく、コードを実際に変更する必要はありませんが、特定の環境 (Apache サーバー) とそれを構成する機能が必要です。

また、チャンクアップロードや再開可能なアップロードなどの優れた機能をサポートするjQuery-File-Uploadを使用して幸運に恵まれました。mod_porter のようなものがなくても、これはアップロード中に実行スレッド全体を拘束する可能性がありますが、適切に実行されれば、メモリ上で適切なはずです。これにより、ファイルが「クローズ」され、その結果、処理が容易になります。このアプローチを実装するには、ビュー レイヤーを調整する必要があり、すべてのブラウザーで機能するとは限りません。

可能なオプションとして FTP と bittorrent について言及しました。サーバーにかなり近いファイルを取得できるため、これらは思ったほど悪いオプションではありません。(ご指摘のとおり)アップロードするマシンに存在する場合と存在しない場合がある追加のクライアントが必要になるため、それらは相互に排他的ではありません。これが機能する方法は、基本的に、アプリから見えるようにダンプする領域を設定することです。次に、何らかの処理を行う必要がある場合は、cron ジョブ (または何でも) を実行して、その場所のアップロードを監視し、サーバーの処理方法をトリガーします。これは、上記のメソッドが提供できる即時の応答を取得しませんが、間隔を十分に小さく設定してかなり近づけることができます。この方法の唯一の本当の利点は、使用されるプロトコルが大きなファイルの転送により適していることです。

処理がまったく必要ない場合は、それらを使用して S3 に直接移動することをお勧めします。このソリューションは、実際にサーバー以外のファイルで何かをする必要があるとすぐに失敗します..

Rails アプリで HTML5 FileSystemAPI を使用した経験がないため、その点について話すことはできませんが、サポートできるクライアントが大幅に制限されるようです。

残念ながら、真の特効薬は 1 つではありません。達成しようとしていることに照らして、これらのオプションのすべてを環境と比較検討する必要があります。たとえば、Web サーバーを構成したり、ローカル ファイル システムに永続的に書き込んだりすることができない場合があります。jQuery-File-Upload は、実際にはアプリケーションを変更するだけでよく、実装を別の環境に最も簡単に移動できるため、ほとんどの環境でおそらく最善の策だと思います。

于 2013-06-03T23:53:57.180 に答える
6

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

http://tus.io/

于 2016-07-26T13:29:28.143 に答える
3

http://www.jedi.be/blog/2009/04/10/rails-and-large-large-file-uploads-Looking-at-the-alternatives/には、オプションの優れた比較がいくつかあります。レール。

スルーしてください。私の場合は役に立ちました。

また、別のサイトにアクセスしてください:- http://bclennox.com/extremely-large-file-uploads-with-nginx-passenger-rails-and-jquery

これでうまくいかない場合はお知らせください

于 2013-06-04T07:40:43.127 に答える
1

Brad Werthが答えを打ち出したと思います

S3に直接アップロードできるアプローチは1つだけです(理論的にはaws lambdaを使用してアプリに通知した後に再処理が必要な場合でも...しかし、正直に言うと、ここで推測しているだけで、解決しようとしています私自身も同じ問題です。これについては後で詳しく説明します)

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

搬送波を使用する場合

于 2015-05-27T20:41:14.100 に答える
1

また、実際のソリューションを探している他の人に役立つ可能性のあるいくつかのオプションを特定させてください.

私はRuby 2.7を搭載したRails 6を持っています。このアプリの主な目的は、ユーザーが画像やビデオをアップロードして高品質で再処理できるGoogleドライブのような環境を作成することです.

もちろん、Sidekiq のバックグラウンド ジョブを使用してローカル処理を試してみましたが、1GB 以上の大きなアップロードでは圧倒されました。tuts.io を試してみましたが、個人的には、Jquery ファイルのアップロードのようにセットアップするのは簡単ではないと思います。

そのため、AWS で実験を行いました..以下にリストされている手順で移動すると、魅力的に機能しました..ブラウザから直接 S3 にアップロードしました

  • React ドロップ ゾーン アップローダーを使用して、複数のファイルを S3 にアップロードします。
  • 入力バケット用に AWS Lambda をセットアップして、そのバケットでのすべてのタイプのオブジェクト作成に対してトリガーされるようにします。
  • この Lambda はファイルを変換し、再処理されたファイルを別のファイルに再度アップロードします。つまり、バケットを出力し、AWS SNS を使用して通知し、何が機能し、何が失敗したかを追跡します。
  • Rails 側では... 新しい出力バケットを動的に使用し、それを AWS Cloud-front ディストリビューションで提供します。

MediaConvert に関する Aws のノートをチェックして、ステップバイステップ ガイドを確認することができます。また、あらゆる種類の実験用によく書かれた Github リポジトリもあります。

したがって、ユーザーの観点からは、1 つの大きなファイルをアップロードできます。S3 でAcceleration有効にすると、React ライブラリはアップロードの進行状況を表示し、アップロードされるとRails callback api、S3 BUCKET のようにその存在を再度確認し、mybucket/user_id/file_uploaded_slugそれを介してユーザーに確認しますシンプルなフラッシュメッセージ。必要に応じて、アップロード/エンコードの成功をエンドユーザーに通知するように Lambda を設定することもできます。

このドキュメントを参照してください - https://github.com/mike1011/aws-media-services-vod-automation/tree/master/MediaConvert-WorkflowWatchFolderAndNotification

ここで誰かに役立つことを願っています。

于 2021-01-25T08:07:46.640 に答える