model.rb:Rails的回形针和SVG图片
has_attached_file :image validates_attachment :image, :content_type => { :content_type => ['image/svg+xml'] }
结果:“图像上有一个扩展,不符合它的内容是无效的,是无效的”
当试图附加一个事实上有效的SVG文件。
注意,我也尝试了'image/svg-xml'
类型具有相同的结果
model.rb:Rails的回形针和SVG图片
has_attached_file :image validates_attachment :image, :content_type => { :content_type => ['image/svg+xml'] }
结果:“图像上有一个扩展,不符合它的内容是无效的,是无效的”
当试图附加一个事实上有效的SVG文件。
注意,我也尝试了'image/svg-xml'
类型具有相同的结果
的解决了这个问题对我来说是要确保在SVG文件的内容与此开始:
<?xml version="1.0" standalone="yes"?>
在引擎盖下,Paperclip使用file
命令来确保文件的内容与文件的名称相匹配。该检查似乎希望在SVG文件的开始处使用此声明。
我觉得这是不幸的考虑,一个sample file from W3C甚至没有它在那里:
<svg id='svg1' viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'>
<circle r="32" cx="35" cy="65" fill="#F00" opacity="0.5"/>
<circle r="32" cx="65" cy="65" fill="#0F0" opacity="0.5"/>
<circle r="32" cx="50" cy="35" fill="#00F" opacity="0.5"/>
</svg>
我考虑在模型中添加一些逻辑,以这种增加的内容,如果开始它在运行检查之前尚未存在。不知道我是否应该真的这样做。
正如Chris Peters提到的那样,file
命令被用于检查MIME类型。在我的Ubuntu机器上,PaperClip(在应用程序级别)正确地将MIME类型标识为'image/svg+xml'
,但系统命令file
将MIME类型标识为text/html
。 (您可以通过运行file --mime-type your_file.svg
来测试)。
一种解决方法是定义一个内容类型映射接受svgs与任一image/svg+xml
或text/html
:
Paperclip.options[:content_type_mappings] = {
svg: %w(image/svg+xml text/html)
}
这可以在一个回形针初始化在一个Rails应用程序来完成,例如config/initializers/paperclip.rb
。
就我个人而言,如果您从cms中的管理员那里接受用户输入信息,我认为这是可以接受的,因为您可能相信他们不会试图搞恶作剧。但我不确定这将是多么的安全。
您可以在命令行尝试'file --mime'和'mimetype '来查看找到的类型。你在使用什么操作系统? –
2014-03-28 14:52:26
如何在Windows 7上执行此操作? – sarink
在rails控制台中,'Paperclip.run(“file”,“-b --mime:file”,:file =>'')'其中是您的SVG文件。 –
2014-03-28 15:11:02