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

问题描述 投票:1回答:1

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

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

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

但是这段代码总是生成样本,即使是较小的文件。有没有办法在样本生成之前检查附加的文件尺寸?

ruby-on-rails ruby paperclip
1个回答
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并测试它是否已经定义(它不漂亮但是它有效!)。
© www.soinside.com 2019 - 2024. All rights reserved.