给定变量content_type = "application/pdf"
,它还可以包含任何其他mime类型。
如何获取内容类型的默认扩展名?
我目前有两种解决方案,看起来非常“复杂”。
破解字符串
content_type.split("/")[1]
使用MIME ::类型
require 'mime/types'
MIME::Types[content_type].first.extensions.first
有更好的解决方案吗?
答案 0 :(得分:13)
您需要的只是使用ruby的Hash.invert
方法。
This answer显示了如何操作:
Rack::Mime
具有此功能(而Rack是Rails的依赖项):require 'rack/mime' Rack::Mime::MIME_TYPES.invert['image/jpeg'] #=> ".jpg"
如果您要经常进行查找,您可能希望记住反向哈希,因为这不是一种廉价的操作。
从你的标签来看,无论如何你似乎都在使用rails。
答案 1 :(得分:5)
使用mime类型的第二个解决方案是您应该选择的解决方案。有几个原因:
Hack the string
可能不一致或返回意外结果(考虑application/postscript
的扩展名为eps
!)答案 2 :(得分:0)
除了上述答案,我个人喜欢使用 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
扩展名保存。