使用Refile获取图像尺寸

时间:2016-02-21 21:00:23

标签: ruby-on-rails ruby-on-rails-4 minimagick refile

使用Refile gem处理Rails中的文件上传,在上传期间/之后确定图像高度和宽度的最佳方法是什么?这个AFAIK没有内置的支持,我无法弄清楚如何使用MiniMagick。

3 个答案:

答案 0 :(得分:10)

@ russellb的评论几乎让我在那里,但不是很正确。如果你有一个名为@file的Refile :: File,你需要:

fileIO = @file.to_io.to_io
mm = MiniMagick::Image.open(fileIO)
mm.width # image width
mm.height # image height

是的,这是对#to_io>的两次调用...<第一个to_io给你一个Tempfile,这不是MiniMagick想要的。希望这有助于某人!

- 更新 -

额外的皱纹:如果文件非常小(< ~20kb,来自:ruby-forum.com/topic/106583),这将失败,因为你不会从to_io获得临时文件,而是获得StringIO。如果你得到一个StringIO,你需要分叉代码并执行:

mm = MiniMagick::Image.read(fileio.read)

所以现在我的完整代码是:

# usually this is a Tempfile; but if the image is small, it will be 
# a StringIO instead >:[
fileio = file.to_io

if fileio.is_a?(StringIO)
  mm = MiniMagick::Image.read(fileio.read)
else
  file = fileio.to_io
  mm = MiniMagick::Image.open(file)
end

答案 1 :(得分:3)

Refile附件有一个to_io方法(请参阅Refile::File docs),它返回一个可以传递给MiniMagick的IO对象。

假设您的图片模型带有file附件(ID存储在file_id字符串列中)以及widthheight列,您可以使用以下回调:

class Image < ActiveRecord::Base

  attachment :file

  before_save :set_dimensions, if: :file_id_changed?

  def set_dimensions
    image = MiniMagick::Image.open(file.to_io)
    self.width = image.width
    self.height = image.height
  end

end

希望有所帮助。

答案 2 :(得分:0)

您可以使用MiniMagick执行此操作(但需要使用最新版本)。

image = MiniMagick::Image.open('my_image.jpg')
image.height #=> 300
image.width  #=> 1300

这在gemME的README.md中有很好的记录:https://github.com/minimagick/minimagick