1

私の FileHandler モデルは、すべてのタイプのファイルを許可できます

class FileHandler < ActiveRecord::Base
   serialize :properties, ActiveRecord::Coders::Hstore
   mount_uploader :file_path, FileUploader

  //I'm already setting some of the file attributes here
  def update_file_attributes
    if file_path.present? && file_path_changed?
      self.file_name = file_path.file.filename
      self.file_type = file_path.file.content_type
      self.file_size = file_path.file.size
    end
  end
  //I want to get height and width here
  #Hstore
  %w[ImageHeight ImageWidth].each do |key|
    attr_accessible key

    define_method(key) do
      properties && properties[key]
    end

    define_method("#{key}=") do |value|
      self.properties = (properties || {}).merge(key => value)
    end
  end

そして私のfileUploaderクラス

class FileUploader < CarrierWave::Uploader::Base

  # Include RMagick or MiniMagick support:
  include CarrierWave::RMagick

   version :big, :if => :image? do
    process :resize_to_limit => [760, nil]
   end

   version :thumb_big, :if => :image? do
    process :resize_to_limit => [200, 200]
   end

   version :thumb, :if => :image? do
    process :resize_to_limit => [160, 160]
   end

   version :tiny, :if => :image? do
    process :resize_to_limit => [40, 40]
   end

   protected
     def image?(new_file)
      new_file.content_type.include? 'image'
     end
end

私の質問は、元の画像の高さと幅のプロパティを取得して hstore フィールドに保存するにはどうすればよいですか? どんな助けでも大歓迎です。

4

3 に答える 3

3

これを試して

class FileUploader < CarrierWave::Uploader::Base

  # Include RMagick or MiniMagick support:
  include CarrierWave::RMagick
  process :store_geometry, :if => :image?

  #......
  #......
  #......

  def store_geometry
    if image?(@file)
      img = ::Magick::Image::read(@file.file).first
      if model
        model.ImageWidth = img.columns
        model.ImageHeight = img.rows
      end
    end
  end
end

#Hstore

  %w[ImageHeight ImageWidth].each do |key|
    attr_accessible key

    define_method(key) do
      properties && properties[key]
    end

    define_method("#{key}=") do |value|
      self.properties = (properties || {}).merge(key => value)
    end
  end

前提
ファイルが画像かどうかを確認する image メソッドがあるのには理由があると思います。それは、他のファイル形式もアップロードしていることを意味するに違いありません。ファイルが画像の場合にのみ、process_geometry メソッドを呼び出します。それが役に立てば幸い。

于 2013-07-03T19:57:10.493 に答える