Ruby on rails 如何获取给定内容类型的默认扩展名?

Ruby on rails 如何获取给定内容类型的默认扩展名?,ruby-on-rails,ruby,Ruby On Rails,Ruby,给定变量content\u type=“application/pdf”,该变量还可以包括任何其他mime类型 如何获取内容类型的默认扩展名 我目前有两个解决方案,看起来非常“复杂” 破解字符串 content_type.split("/")[1] 使用MIME::类型 require 'mime/types' MIME::Types[content_type].first.extensions.first 有更好的解决方案吗?mime类型的第二个解决方案是您应该选择的解决方案。这

给定变量
content\u type=“application/pdf”
,该变量还可以包括任何其他mime类型

如何获取内容类型的默认扩展名

我目前有两个解决方案,看起来非常“复杂”

破解字符串

content_type.split("/")[1]
使用MIME::类型

  require 'mime/types'
  MIME::Types[content_type].first.extensions.first 

有更好的解决方案吗?

mime类型的第二个解决方案是您应该选择的解决方案。这有几个原因:

  • 第二个解决方案完全是为您的用例设计的
  • Hack字符串
    可能不一致或返回意外结果(想想
    application/postscript
    具有扩展名
    eps
    !)
  • 请考虑,我们可能不能说,每个MIME类型都有默认扩展名。例如:谁为jpg(或jpeg或jpg..)图像定义了默认扩展名
您所需要的就是使用ruby的
Hash.invert
方法

演示如何执行此操作:

具有此功能(机架依赖于Rails):

如果要经常查找,您可能希望将反向散列存储起来,因为这不是一个便宜的操作

从您的标签来看,似乎您正在使用rails。

MimeMagic 除了以上的答案,我个人喜欢使用

TL;博士 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'

因此,我突然看到一些
xml
文件被保存为
.xsl
扩展名。

使用了第二种解决方案,效果非常好。顺便说一下,在rails应用程序中,我不需要mime/类型。
require 'mimemagic'
MimeMagic.new('image/jpeg').extensions.first #=> 'jpg'
# Note that this does not include the dot (.) in the extension.
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'
MimeMagic.new('application/xml').extensions #=> ["xml", "xbl", "xsd", "rng"]
Rack::Mime::MIME_TYPES.invert['application/xml'] #=> ".xsl"