在Shrine中调整原始图像本身的大小时如何上传

我在Ruby on Rails应用程序中使用Shrine来创建调整图像大小并将图像上传到存储的过程。

我当前的代码是:


image_uploader.rb

require "image_processing/mini_magick"

class ImageUploader < Shrine
  plugin :derivatives

  Attacher.derivatives_processor do |original|
    magick = ImageProcessing::MiniMagick.source(original)
    {
      resized: magick.resize_to_limit!(120,120)
    }
  end

end

user.rb

class User < ApplicationRecord
  include ImageUploader::Attachment(:image)
  before_save :image_resize

  def image_resize
    self.image_derivatives!
  end
end

我在阅读official documentation时实现了它,但这在两种方式中是不可取的。

  1. 需要模型代码中的触发器。只能用image_uploader.rb完成吗?
  2. 要访问使用此代码生成的图像,需要使用“调整大小”前缀(例如@user.image(:resized).url),并且原始图像也将保留在存储中。我要处理原始图像本身。

在解决这两个问题的同时可以上传吗?

meachol 回答:在Shrine中调整原始图像本身的大小时如何上传

  1. 您可以添加以下补丁,该补丁将触发派生工具的创建,作为将缓存文件提升为永久存储的一部分:

    # put this in your initializer
    class Shrine::Attacher
      def promote(*)
        create_derivatives
        super
      end
    end
    
  2. 您可以仅覆盖检索附件的模型方法以返回调整后的版本。您可以使用此上传器,使用included插件对所有模型执行此操作:

    class ImageUploader < Shrine
      # ...
      plugin :included do |name|
        define_method(name) { super(:resized) }
      end
    end
    

关于第二个问题:它仍将原始文件保留在存储器中,但默认情况下只返回调整大小的版本。通常最好在视图装饰器中执行此操作。

您始终希望将原始文件保留在存储中,因为您不知道何时需要重新处理它。可能会发现您当前的调整大小逻辑对于某些文件类型和大小而言并不理想,在这种情况下,您需要为先前的附件重新生成调整大小的版本。如果您再也没有原始文件,您将无法执行此操作。

本文链接:https://www.f2er.com/3040377.html

大家都在问