我正在构建一个代理不同服务的Rails端点,并映射来自所述服务的响应。主要问题是将文件附件的字节数据传递给该服务。
一个约束是我必须对文件进行一些健全性检查才能传递它。
我没有必要在我的Rails应用程序中保留该文件,它仅用作其他服务的输入。
在一个非常简单的实现中,我只是从适当的请求参数中读取字节,该参数包含在Tempfile
中,但这当然不需要进行健全性检查,因此不够好。
我有兴趣进行Paperclip支持的各种验证,特别是大小和内容类型,但我不希望将实际文件存储在任何地方。
是否可以仅使用Paperclip的验证部分而不将附件存储在任何位置?
答案 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