Paperclip
paperclipはRailsのプラグインで、データに画像などの添付ファイルがある場合にそのハンドリングに役立つ。
例えば、画像をアップロードすると、ルールに従った場所(ファイルシステム)に保存し、サムネールなどサイズ変更も自動的にやってくれる。
目次 |
ファイルの保存場所
ファイルの保存先はデフォルトだと次の場所
:rails_root/public/system/:attachment/:id/:style/:filename
変更したい場合は model で宣言する has_attached_file の次の引数で指定する。
- :url(ブラウザ表示時のURL)
- :path(保存先パス)
それぞれで使える変数は:attachment、:id、:style、:filename。:attachment には画像フィールド名の複数形が入る。
ちなみに:styleには何も指定していないと original という値が入っていた。
標準外のパラメータをpathやurlの設定に使う
次の様なコードをモデルクラスに追加すると、標準外のパラメータをpathやurlの設定に使える。 また、モデルクラスではなく、config/initializersに適当なファイルを作って、このコードを記述しても良い。そうすればいちいちモデルクラスに記述する必要がなくなる
この例ではモデルが持っているuser_idを :user_id というパラメータとして取得できる様になる。
Paperclip.interpolates :user_id do |attachment, style| attachment.instance.user_id end
これをpathの設定で使えば、user_id毎にアップロードファイルを保管できる。
:path => ":rails_root/public/system/:attachment/:user_id/:style/:id.:extension"
file-uploader + Paperclip の実装をPassengerで動かすと動かない場合の対処法
valums/file-uploader - GitHubとPaperclipを使うとドラックドロップでファイルアップロード可能なアプリケーションが楽に実装できる。 実装の方法は次のサイトが参考になる。 [Rails3 ドラッグ&ドロップでファイルアップロード | KRAY Inc]
開発環境ではwebbrickを使うこと多いがこの環境では動作するのに、本番環境にPassengerを使う場合、リクエストからのデータの取り出しを次のように変更しないと動かない。
file = request.bodyfile = StringIO.new(request.body.read)
参考: rails ajax file upload and nginx - Programmers Goodies
動画サムネールを作る
独自のprocsesserを実装し、動画の場合にはそちらで処理するように設定する。
具体的な方法は次のサイトが参考になる。
次のサイトが参考になる just