model.rb:
has_attached_file :image
validates_attachment :image,
:content_type => { :content_type => ['image/svg+xml'] }
这段代码会导致以下错误信息:"图片的扩展名与其内容不匹配,无效且不合法",即使你尝试上传一个有效的SVG文件。
请注意,我已经尝试使用相同的方式来上传'image/svg-xml'类型的文件,但结果相同。
model.rb:
has_attached_file :image
validates_attachment :image,
:content_type => { :content_type => ['image/svg+xml'] }
这段代码会导致以下错误信息:"图片的扩展名与其内容不匹配,无效且不合法",即使你尝试上传一个有效的SVG文件。
请注意,我已经尝试使用相同的方式来上传'image/svg-xml'类型的文件,但结果相同。
<?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
来测试这一点。)image/svg+xml
或text/html
的svg文件:Paperclip.options[:content_type_mappings] = {
svg: %w(image/svg+xml text/html)
}
config/initializers/paperclip.rb
。上面的答案解决了我的问题,但我不得不将text/html更改为text/plain。 这是我的mime-types配置:
Paperclip.options[:content_type_mappings] = {
:json => 'text/plain',
:twbx => 'application/zip',
:twb => 'application/xml',
svg: %w(image/svg+xml text/plain)
}
file --mime <file>
和mimetype <file>
命令来查看文件类型。你使用的操作系统是什么? - user740584Paperclip.run("file", "-b --mime :file", :file => '<file>')
其中<file>是您的SVG文件。 - user740584file
命令的输出与MIME::Types
进行比较。似乎 Windows 没有file
命令,因此 Paperclip 将其设置为""
,显然不匹配。您可以通过遵循此问题中的解决方案来禁用欺骗:https://dev59.com/ln3aa4cB1Zd3GeqPiM_z#22529404 - user740584