content_type = "application/pdf"
给定也可以包含任何其他 mime 类型的变量。
如何获取内容类型的默认扩展名?
我目前有两种解决方案,看起来非常“复杂”。
破解字符串
content_type.split("/")[1]
使用 MIME::Types
require 'mime/types'
MIME::Types[content_type].first.extensions.first
有更好的解决方案吗?
content_type = "application/pdf"
给定也可以包含任何其他 mime 类型的变量。
如何获取内容类型的默认扩展名?
我目前有两种解决方案,看起来非常“复杂”。
破解字符串
content_type.split("/")[1]
使用 MIME::Types
require 'mime/types'
MIME::Types[content_type].first.extensions.first
有更好的解决方案吗?
您需要做的就是使用 ruby 的Hash.invert
方法。
这个答案显示了如何做到这一点:
Rack::Mime
有这个能力(并且 Rack 是 Rails 的依赖项):require 'rack/mime' Rack::Mime::MIME_TYPES.invert['image/jpeg'] #=> ".jpg"
如果您要经常进行查找,您可能希望记住反向哈希,因为这不是一项廉价的操作。
从您的标签来看,您似乎仍然在使用导轨。
mime 类型的第二个解决方案是您应该选择的解决方案。有几个原因:
Hack the string
可能不一致或返回意外结果(想想application/postscript
有扩展名eps
!)除了上面的答案,我个人喜欢使用MimeMagic
.
require 'mimemagic'
MimeMagic.new('image/jpeg').extensions.first #=> 'jpg'
# Note that this does not include the dot (.) in the extension.
MimeMagic 的其他可能有用的功能
MimeMagic.new('image/jpeg').image? #=> true
MimeMagic.by_magic('<?xml version="1.0" ?><test></test>').type #=> 'application/xml'
MimeMagic.by_extension('.html').type #=> 'text/html'
我最近从Rack::Mime
到 ,MimeMagic
因为我还尝试从文件内容中检测 Mime 类型是什么。为了确保这是反向兼容的,我需要使用 MM 进行所有方向的转换:
我切换的主要原因是翻译application/xml
为扩展时的差异:
MimeMagic.new('application/xml').extensions #=> ["xml", "xbl", "xsd", "rng"]
Rack::Mime::MIME_TYPES.invert['application/xml'] #=> ".xsl"
突然间,我看到一些xml
文件以.xsl
扩展名保存。