サーバー上ファイルから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