使用Paperclip验证而不存储附件

时间:2017-07-04 11:27:31

标签: ruby-on-rails rest paperclip

我正在构建一个代理不同服务的Rails端点,并映射来自所述服务的响应。主要问题是将文件附件的字节数据传递给该服务。

一个约束是我必须对文件进行一些健全性检查才能传递它。

我没有必要在我的Rails应用程序中保留该文件,它仅用作其他服务的输入。

在一个非常简单的实现中,我只是从适当的请求参数中读取字节,该参数包含在Tempfile中,但这当然不需要进行健全性检查,因此不够好。

我有兴趣进行Paperclip支持的各种验证,特别是大小和内容类型,但我不希望将实际文件存储在任何地方。

是否可以仅使用Paperclip的验证部分而不将附件存储在任何位置?

2 个答案:

答案 0 :(得分:2)

这就是我最终解决它的方式,受https://gist.github.com/basgys/5712426

的启发

由于我的项目已经使用了Paperclip,我选择了基于它的解决方案,而不是包含更多宝石。

首先,像这样的非持久化模型:

class Thumbnail
  extend ActiveModel::Callbacks
  include ActiveModel::Model
  include Paperclip::Glue

  ALLOWED_SIZE_RANGE = 1..1500.kilobytes.freeze
  ALLOWED_CONTENT = ['image/jpeg'].freeze

  # Paperclip required callbacks
  define_model_callbacks :save, only: [:after]
  define_model_callbacks :destroy, only: %i(before after)

  attr_accessor :image_file_name,
                :image_content_type,
                :image_file_size,
                :image_updated_at,
                :id

  has_attached_file :image
  validates_attachment :image,
                       presence: true,
                       content_type: { content_type: ALLOWED_CONTENT },
                       size: { in: ALLOWED_SIZE_RANGE }

  def errors
    @errors ||= ActiveModel::Errors.new(self)
  end
end

然后,从控制器中将传入的图像文件包装在该模型中:

class SomeController < ApplicationController
  before_action :validate_thumbnail

  def some_action
    some_service.send(image_data)
  end


  private

  def thumbnail
    @thumbnail ||= Thumbnail.new(image: params.require(:image))
  end    

  def validate_thumbnail
    render_errors model: thumbnail if thumbnail.invalid?
  end

  def image_data
    Paperclip.io_adapters.for(thumbnail.image).read
  end

  def some_service
    # memoized service instance here
  end   
end

答案 1 :(得分:1)

您可以使用gem ruby-filemagic验证文件mime-type:

FileMagic.new(FileMagic::MAGIC_MIME).file(your_tempfile.path) #=> "image/png; charset=binary"

您可以使用your_tempfile.size

查看尺寸