Rails回形针和SVG图像
model.rb:
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文件的开始处使用此声明。
我认为这是不幸的,因为来自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>
我正在考虑在模型中添加一些逻辑,将它添加到内容的开头,如果它在运行检查之前尚未存在。 不知道我是否应该真的这样做。
正如克里斯·彼得斯提到的那样, 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)
}
这可以在PaperClip初始化器中完成,例如Rails应用中的config/initializers/paperclip.rb
paperclip.rb。
就我个人而言,如果你从cms中的管理员那里接受用户意见,我觉得这是可以接受的,因为你可能相信他们并不是在试图捣乱。 但我不确定这将是多么的安全。
链接地址: http://www.djcxy.com/p/19671.html上一篇: Rails paperclip and SVG images
下一篇: Json.net deserialize json with circular reference in MVC4