Ruby on Railsで画像を保存する方法は何ですか?


9

私はiOSで開発しており、PHPバックエンドからRuby on Railsに切り替えています。交換形式はJSONです。

Googleで「Railsに画像を保存」をすばやく検索すると、画像データをblobとしてデータベースに保存することについてほとんどすべての結果が得られます。誤解しているかもしれませんが、データベースに画像データを保存すると、ファイルの場所( '/img/subcat/4656.png'へのリンクを保存するのとは対照的に)に多大な時間とスペースが無駄になるという印象を受けます。

PHPでは、データを受け取り、ファイル名を生成し、そのファイルをディスクに保存し、データベースをディスク上のイメージの場所で更新するのはかなり標準的です。これはRuby on Railsでも同じですか、それとも、知らない組み込みのActiveRecord画像機能がありますか?


1
私はPaperClipに出会いました。これは、私が望むものにかなり近いようです。何千もの画像を最適な速度で提供および受信する方法については、経験豊富なRailsの人々からのアドバイスに引き続き感謝します。
ユーザー

1
イメージがdbまたはディスクと同じだけのスペースを取ることを知っていますか?直感的には、Railsはデータベースに格納すると思います。なぜなら、キャッシュを処理するためにPHPほどApacheに依存していないからです。しかし、それは完全に間違っているかもしれません。
Florian Margaine 2013

2
ええ、私は画像データが保管場所によって操作されることはないと思います。Railsは異なる場合がありますが、信頼できるSOメンバーの中には、データベース内のファイルパスに頼っているように見えるもいます。さらに、データベースのスケーリングは難しいので、データベースに大量の画像データを保存しても、それが容易になることはありません。
ユーザー

回答:


4

過去に私がやったことは、Amazon S3CloudFront CDNでPaperClipを使用して配信を高速化することです。PaperClipは、箱から出してすぐにS3ストレージを非常にうまくサポートします。S3 ストレージ構成オプションのドキュメントを参照しください。

  1. CloudFrontディストリビューションをセットアップして、画像リクエストをS3バケットに転送し、その他の静的アセットのリクエストをRuby on Railsアプリケーションに転送します(または、それらをS3にアップロードすることもできますが、この質問の範囲外です)。
  2. CloudFrontディストリビューションを指すように制御するドメイン(assets.example.comなど)のCNAME
  3. PaperClip構成で、を設定しs3_host_alias: assets.example.comます。これにより、CloudFrontディストリビューションホストを使用するために、保存された画像リソースへの生成されたURLが生成されます
  4. Ruby on Rails構成で、次のことができますconfig.action_controller.asset_host = http://assets.example.com。Ruby on RailsアセットURLも、キャッシュ/高速配信のためにCloudFrontディストリビューションを使用します。

それはかなり大ざっぱですが、うまくいけば、いくつかの有用なリソースの方向性が示されます。もちろん、これは1つの解決策にすぎませんが、データベースで数十万の画像添付ファイルを処理している状況で私にとってうまくいった解決策です。

(あなたのケースのために必要または有用ではない可能性のある先進的なステップとして、あなたはまたのようなあなたのCloudFrontの配信のために複数のCNAMEを設定することができますassets0.example.comし、assets1.example.com両方クリップs3_host_aliasaction_controller.asset_host、あなたが確定的(に基づいてすることができますラムダを取ることができますアセット)ブラウザーが同じホストへの同時接続の最大数を制限するため、同じページに多数のホストをダウンロードする場合の並列化を向上させるために、異なるホストを使用するURLを生成します。)


3

いくつかの宝石を試しましたが、今はPaperClipと一緒にFineUploaderを使用しています

FineUploaderは、アップロードの進行状況、ドラッグアンドドロップ、複数のファイルのアップロードなど、多くのGUIを処理します。S3ではなくサーバーに画像を保存するため、PaperClipを使用しています。

私たちが通常行うことは、最初からコンテンツを再作成するのではなく、すぐに使用できる構成可能なソリューションを探すことです。PaperClipを使用して画像を保存し、StateMachineを使用して画像を変換し、ファイル名に基づいてカテゴリに入れます。私はあなたと同じ質問をしました、そしてこれは私の最も効果的な解決策でした、それが私がそれを共有する理由です。


2
これは、外部パッケージが作業を行うための推奨事項にすぎません。OPは、Ruby on Rails開発者が画像を保存するために通常何をするかを求めていましたが、推奨事項ではありませんでした。これは1つのパッケージがそれを行う方法の例であるかもしれませんが、これは実際には質問に答えません。
Martijn Pieters 2013年

そうだね。私たちが通常行うことは、最初からコンテンツを再作成するのではなく、すぐに使用できる構成可能なソリューションを探すことです。PaperClipを使用して画像を保存し、StateMachineを使用して画像を変換し、ファイル名に基づいてカテゴリに入れます。OPと同じ質問がありましたが、これが私の最も効果的な解決策
でし
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.