Paperclip + RSpec:content_type验证

时间:2014-02-06 18:22:09

标签: ruby-on-rails ruby-on-rails-4 rspec paperclip

我在我的Rails应用程序中使用Paperclip来附加images。 我在模型中声明了content_type的验证为

 validates_attachment :image,
  :content_type => { :content_type => ["image/jpg", "image/gif", "image/png"] }

我有两个例子,一个是有效图像,另一个是无效图像 对于无效图片,我只是将.txt文件重命名为.png

 it "Image is valid" do
    image = File.new("#{Rails.root}/spec/support/right.png")
    expect(FactoryGirl.build(:pin, image: image)).to be_valid
 end
 it "Image is invalid" do
   image = File.new("#{Rails.root}/spec/support/wrong.png")
   expect(FactoryGirl.build(:pin, image: image)).to have(1).errors_on(:image_content_type)
 end

我希望我的两个示例都能成功运行。但是,我的第二个例子失败了。 对于wrong.png的content_type,我没有收到任何错误。

我认为Paperclip的content_type验证实际上会检查上传文件的文件格式(二进制数据编码)。但似乎在这里,它只是检查文件扩展名。此验证仅检查上传文件的扩展名吗?

我可能在这里遗漏了一些东西(配置?)。 Paperclip中是否还有其他验证可用于实现此目的?或者在这种情况下我应该选择自定义验证器吗?

1 个答案:

答案 0 :(得分:5)

Paperclip在4.1.1上发布的最新版本February 21, 2014已解决此问题。

以下两个示例现在都正确传递。

it "Image is valid" do
    image = File.new("#{Rails.root}/spec/support/right.png")
    expect(FactoryGirl.build(:pin, image: image)).to be_valid
end
it "Image is invalid" do
   image = File.new("#{Rails.root}/spec/support/wrong.png")
   expect(FactoryGirl.build(:pin, image: image)).to have(1).errors_on(:image_content_type)
end

经过一番研究后发现, 当我上传invalid image时,

例如:欺骗(重命名)wrong.txt文件为wrong.png并上传。

在Paperclip的早期版本中,wrong.png通过content_type验证并不会出现任何错误,因为Paperclip仅用于上传文件的check the extensions而非内容内。

然而,在当前版本的Paperclip 4.1.1中,相同的欺骗wrong.png未通过验证并在视图中抛出以下错误:

Image has an extension that does not match its contents

在调查服务器日志条目后,我发现了以下内容:

  

Command :: file -b --mime-type   '在/ var /文件夹/ TG / 8sxl1vss4fb0sqtcrv3lzcfm0000gn / T / a7f21d0002b0d9d91eb158d702cd930320140317-531-swkmb8'   [paperclip]内容类型欺骗:Filename wrong.png([" image / png"]),   从文件命令中发现的内容类型:text / plain。看到   允许这种组合的文档。

在这里,您可以看到Paperclip实际检查了上传文件的内容,说明了text/plain并且错误地说Content Type Spoof

希望我的发现能够帮助其他人了解Paperclip's content-type验证在一段时间内的改进情况。