StringIO的Paperclip验证无效

时间:2016-05-09 13:57:39

标签: ruby-on-rails paperclip paperclip-validation

我想使用Paperclip gem(4.3.6)从第三方API流式传输文件,并使用HTTP响应的正文作为代表传真的ActiveRecord模型的附件。

class Fax
  has_attached_file :fax_document
  validates_attachment_content_type :fax_document, content_type: { content_type: ["application/pdf", "application/octet-stream"] }
end

我正在使用以下代码从API服务器获取HTTP响应,并将其另存为传真模型上的附件。 (为简洁起见,下面的代码略有修改)。

#get the HTTP response body
response = download(url)

#add the necessary attributes to the StringIO class. This technique is demonstrated in multiple SO posts.
file = StringIO.new(response)
file.class.class_eval { attr_accessor :original_filename, :content_type }
file.original_filename = "fax.pdf"
file.content_type = 'application/pdf'

#save the attachment
fax = Fax.new
fax.fax_document = file
fax.save

response变量包含看起来像pdf二进制对象的字符串表示形式,fax.save引发content_type无效错误。如果我使用do_not_validate_attachment_file_type :fax_document明确放宽传真模型上的Paperclip验证,则附件将正确保存。

我怀疑Paperclip内容类型验证失败了,因为它无法判断返回的内容实际上是'application / pdf'。

为什么Paperclip会引发content_type无效错误?如何告诉Paperclip响应的正文是pdf?

1 个答案:

答案 0 :(得分:1)

我认为你的validates_attachment_content_type定义是错误的。您不应将散列传递给:content_type选项,而应传递single content type or an array of types

在您的情况下,应执行以下操作:

validates_attachment_content_type :fax_document, 
       content_type: ["application/pdf", "application/octet-stream"]