Rails - Paperclip - 如何在保存前检查图像尺寸

14

我有一个使用paperclip的Rails 3应用程序。 我想要防止宽度/高度LTE 50x50的图像被paperclip保存。

这个可能吗?

1个回答

37

没错!这里是我为我的应用程序编写的自定义验证,它可以直接在您的应用程序中使用,只需将像素设置为您想要的任何值即可。

def file_dimensions
  dimensions = Paperclip::Geometry.from_file(file.queued_for_write[:original].path)
  self.width = dimensions.width
  self.height = dimensions.height
  if dimensions.width < 50 && dimensions.height < 50
    errors.add(:file,'Width or height must be at least 50px')
  end
end

需要注意的是,我使用了 self.width=self.height= 来保存图像的尺寸到数据库中。如果您不关心存储图像的尺寸,则可以将它们省略。

检查宽度和高度意味着只需要其中一个大于50px即可。如果要确保两者都大于50,具有讽刺意味的是,您需要检查宽度或高度。对我来说,在这种情况下,一者为与操作,二者为或操作似乎很奇怪。

唯一需要注意的其他地方是,您需要在最后运行此验证:如果模型上已经存在其他错误,它将引发异常。老实说,我已经有一段时间没有记起错误消息是什么了,但在您的验证逻辑中,请使用以下内容:

validate :file_dimensions, :unless => "errors.any?"

那应该就搞定了!


我得到了一个错误:未定义方法 `to_file',发生在 <Rake::FileTask => []>:Rake::FileTask。 - Rimian
2
糟糕!因为我的属性是“图像”,而不是“文件”。 - Rimian
1
作为更新,to_file已被弃用并移除。现在正确的方法是使用file.queued_for_write[:original]。https://github.com/thoughtbot/paperclip/issues/812 - Calvin
1
当有人处于“编辑”而不是“新建”状态时,您如何处理?当他们创建新记录时,您如何仅检查文件尺寸? - Vu Nguyen
@Andrew 我编辑了答案,这是基于我之前的评论。与其将if语句添加到validate方法中,最好在验证尺寸之前先检查是否有新文件排队。 - Daniel
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接