サーバー上ファイルからDBに画像をインポート@acts_as_attachment
今までファイル管理されていたデータをDBにがつっとアップロードするためにacts_as_attachementのフォーマット上にファイルを展開する。
acts_as_attachmentについて詳しくは↓を参照 > 画像をバイナリでSQL保存する、acts_as_attachment
http://d.hatena.ne.jp/sakusan_net/20080311/1205222728
Imageっていうmodelにacts_as_attachmentが適用されています。
def uploadLocalFile(file) if(FileTest.exist?(file)) File.open(file,'r+b') do |f| @image = Image.new() @image.filename = File.basename(file) @image.attachment_data=f.read @image.content_type = "image/gif" @image.save end return @image.id else return nil end end
とりあえずこれでサクッとDBにインポートできました。
詳細
パスからふぃある名だけを切り出し
@image.filename = File.basename(file)
そのまま開くとファイルオブジェクトが帰ってくるのでr+bでバイナリモードで開く
File.open(file,'r+b') do |f|
ファイルを先頭から最後までそのままバイナリで読み込んで突っ込む
@image.attachment_data=f.read
注:今は「gifしか保存しないことが分かっている」のでimage/gifで決め打ちしていますが、何が指定されるか分からない場合は拡張子で判断か、ImageMagickで種類を判定してください。
ちなみにタイプが指定してないと呼んだときにブラウザが画像ファイルって認識できませんでした。
@image.content_type = "image/gif"
ここまでやってセーブすればOKです。
ちなみに実際に使うときは戻り値がイメージデータのテーブルIDになるのでそのままイコールでデータを突っ込めばOK
@object.imageID = uploadLocalFile("#{RAILS_ROOT}/tmp/image.gif") @object.save