6

使用Refile gem 处理 Rails 中的文件上传,在上传期间/之后确定图像高度和宽度的最佳方法是什么?没有对这个 AFAIK 的内置支持,我不知道如何使用 MiniMagick 来做到这一点。

4

3 回答 3

11

@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
于 2016-03-31T21:53:54.390 回答
3

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

假设您有一个带有file附件(id 存储在file_id字符串列中)和width列的 Image 模型,height您可以使用以下回调:

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

希望有帮助。

于 2016-03-12T13:49:07.093 回答
0

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

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

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

于 2016-02-21T21:49:46.913 回答