有条理地生成Paperclip附件的样式

时间:2017-12-16 13:32:18

标签: ruby-on-rails ruby paperclip

我正在研究Paperclip的高级用法。

我使用Paperclip在项目中上传文件(图像或视频)功能。我想为大型(例如大于1000x1000px)附加文件生成调整大小的样本。 我试过这个:

has_attached_file :upload, styles: { sample: '1000x1000>', preview: ['150x150', :jpg] },
      convert_options: { sample: '-quality 90', preview: '-quality 85 -strip' }

但是此代码始终会生成样本,即使对于较小的文件也是如此。有没有办法在样本生成之前检查附加的文件尺寸?

1 个答案:

答案 0 :(得分:1)

好的,由于lambdas和Paperclip的一些问题,我花了很长时间,比我想要的更清楚,我设法解决了这个问题:

您需要使用lambda来决定根据图像大小动态应用哪些样式 - 图像大小本身可以从排队等待处理的图像中确定。

  has_attached_file :image,
                    styles: lambda { |attachment| attachment.instance.decide_styles }

  def decide_styles
    unless @styles
      @styles = {}
      @styles[:preview] = { preview: {
              geometry: "150x150",
              format: :jpg,
              convert_options: "-quality 85 -strip" }}

      dimensions = Paperclip::Geometry.from_file(image.queued_for_write[:original].path)
      if dimensions.width > 1000 or dimensions.height > 1000
        @styles[:sample] = { sample: {
                geometry: "1000x1000>",
                convert_options: "-quality 90" }}
      end
    end

    @styles
  end

当使用带有Paperclip的lambdas时,你需要注意一些问题...

  1. 您似乎不仅需要指定样式,还需要指定任何转换选项等以及样式。建议不要在单独的lambda中指定转换选项。

  2. 在我的情况下,使用带有Paperclip的lambdas就行不通,看起来其他一些人也遇到了这个问题 - decide_styles方法被调用了大约7次,最后一次被调用在尝试确定维度时抛出异常的时间 - 这就是我分配给@styles并测试是否已经定义的原因(它不是很漂亮,但它有效!)。