3

HerokuのRailsアプリにファイルをアップロードするための最良の方法を探しています。セットアップ:Rails 3、Carrierwave、Heroku、Mongoid

問題:散発的に、ユーザーがさまざまなサイズのファイルをアップロードすると、画像はデータベースに保存されますが、AmazonS3ではどの形式でも利用できません。これにより、画像がフロントエンドに欠落画像プレースホルダーとして表示されます。

考えられる原因:画像はアップロードされていますが、処理に時間がかかりすぎて、Herokuの30秒のリクエスト時間制限が厳しいためにリクエストがタイムアウトするか、画像サイズが大きすぎてアップロードしようとすると、リクエストがH12エラーでタイムアウトします。

解決策:carrierwave-directを実装し、処理をバックグラウンドに移動します

ブロッカー:CarrierWaveDirectは、CarrierWaveの代わりにはなりません。実際、イメージのアップロードプロセスにいくつかの大きな変更が導入されています。特に、イメージはdbレコードの永続化と同時にアップロードされません。また、既存のディレクトリ構造では機能しないため、既存のファイルを新しい構造に移動するのは非常に難しいようです。CarrierWaveBackgrounderは、埋め込まれたドキュメントではうまく機能しません。

質問:これを行うにはどうすればよいですか?必要に応じてサンプルコードを作成しますが、単にコーディングするだけでなく、これについても考えてみてください。

4

1 に答える 1

6

単一のファイルを処理する必要がある場合は、CarrierWaveDirectとS3へのアップロードについて詳しく説明しているこのRailscastを確認してください。carrierwave-mongoid gemと組み合わせると、そのルートに行きたい場合は、単一ファイルのアップロードを実行できるはずです。

正直なところ、私は複数のファイルのアップロードに行き、それで終わります。第2部では、CarrierWaveDirectの代わりに標準のCarrierwaveとjQueryFileUploadを使用した複数ファイルのアップロード設定を紹介します。私はその決定に同意する傾向があります。S3に直接POSTするために必要なすべての黒魔術が原因で、正しく機能させることができませんでした。

ライアンのセットアップは最初は恐ろしいように見えますが、それは非常に単純であり、エピソードのソースコードには、面白いビジネスS3が必要とするすべてのフォームデータを処理するヘルパークラスが含まれています。

基本的なワークフローは次のようなものです。

1)ファイルはjQueryプラグインを介してブラウザからS3の一時バケットまたはフォルダに直接アップロードされます。

2)一時アップロードURLを含むAJAX POSTリクエストはアプリに送信され、データベースに保持してワーカープロセスを開始するように指示します。

3)ワーカープロセスは一時ファイルをダウンロードし、CarrierWaveセットアップを実行して、完成したバージョンを適切な場所に保存します。

彼はバックグラウンドジョブにsidekiqを使用していると思いますが、 IronWorkerで同様の設定を行っているので、うまく機能します。jQueryとCarrierWaveを設定したら、実際に仕事に必要なものを何でも使用できます。

また、コメントの中で、作業の一環として一時バケットから生のアップロードファイルを削除して整理する方法を説明しました。そして、S3への直接POSTがどのように機能するかについてのすべての汚い詳細については、ここを参照してください。ヘルパークラスがある場合でも、それを理解することをお勧めします。

于 2012-10-04T08:13:09.887 に答える