QA@IT

RailsでDBに画像をストアするプラグイン

3036 PV

Railsでデータベースに直接、画像ファイルをストアするプラグインはないでしょうか?

有名な、Paperclip, CarrierWaveを確認したところ
標準ではファイルシステム、クラウドサービスへのストアをサポートしていますが、
DBに直接保持する仕組みを提供していないようです。

Attachment_fuというプラグインを使おうとしたところ、
メンテされていないようで、rubygemsからはinstallできません。

  • DBにストアしたい理由は何でしょうか?言い方を返れば、S3 や Cloud Files で満足できないのはどのあたりなんでしょうか? -
  • S3,CloudFilesを使わない理由は、小規模なシステムのため自前サーバ内で完結させたいためです。また、将来、サーバを増設する予定があり、DBにストアしているほうが増設時に考慮することが少なくて済むと考えているためです。 -

回答

データベースにバイナリデータとして直接突っ込めばいいと思います。
コントローラーでそのデータを send_data というメソッドを使ってクライアントに返せば画像が表示されます。

編集 履歴 (0)
  • ありがとうございます。
    考えてみたら、画像をファイルとして保存する場合、ディレクトリ名やらファイル名を生成するといった汎用的な処理を担ってくれるのがプラグインですね。DBストアの場合はプラグインである必要はない気がしてきました。
    -

paperclip だと paperclip_database や paperclip_database_storage というのを使うとデータベースに格納出来るようです。

  • http://rubygems.org/gems/paperclip_database (1.0.5 で確認)
    • 添付ごとにテーブルが出来る
    • Appraisals をみると古いバージョンから新しいバージョンまで対応していて travis-ci で最低限のテストはしている
    • Foo::Bar のように namespace を使っているモデルに対応していない
    • その代わりドキュメントなどが古くなっている部分がある (paperclip_database:migration で生成されるものが deprecated な書き方のままとか)
  • http://rubygems.org/gems/paperclip_database_storage (3.0.0 で確認)
    • ひとつのテーブルですべての添付を扱う
    • ひとつのモデルで複数の添付を持てない
    • ダウンロード用のコントローラーの実装も入っている
    • まだ最初のバージョンなのでいろいろ問題がありそう (migration の add_index に重複があるとか)
編集 履歴 (0)

base64 でエンコードして格納、というのも小さな画像でたまにあるパターンだと思います。
その場合、単純なのでプラグインはとくに必要にならないと思います。

編集 履歴 (0)
  • ありがとうございます。
    上記にも書いた通り、プラグインである必要はないと思い始めました。アドバイスありがとうございます。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。