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 回答
1

Rmagick好吧,据我所知,您可以使用 Image 的尺寸

我只记得你能做的就是这个

  img = Magick::Image::read("image_file").first

  img.columns  => width of image
  img.rows   => height of image

也许你可以在 HSTORE 中设置它们

希望这有帮助

谢谢

于 2013-07-02T09:26:34.277 回答
1

作为汤米评论的补充。这就是我为保存每个特定图像版本的大小而不仅仅是原始图像的大小所做的。您必须在模型中添加“几何”字段,这样您就会有类似:“phone=146x220&tablet=292x440”

    class ImageUploader < CarrierWave::Uploader::Base
        include CarrierWave::RMagick

        storage :file

        version :thumb do
            process :resize_to_fill => [80, 80]
        end

        version :phone do
            process :resize_to_limit => [290, 220]
            process :store_geometry => :phone
            process :quality => 75
        end

        version :tablet do
            process :resize_to_limit => [580, 440]
            process :store_geometry => :tablet
            process :quality => 35
        end

        process 

        def extension_white_list
            %w(jpg jpeg gif png)
        end

        def store_geometry(version)
            manipulate! do |img|
                model.geometry ||= ""
                model.geometry << "&" unless model.geometry.empty?
                model.geometry << "#{version}=#{img.columns}x#{img.rows}"
                img
            end
        end

    end
于 2013-11-14T18:49:00.377 回答