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

时间:2013-02-08 10:40:24

标签: ruby-on-rails ruby

给定变量content_type = "application/pdf",它还可以包含任何其他mime类型。

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

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

破解字符串

content_type.split("/")[1]

使用MIME ::类型

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

有更好的解决方案吗?

3 个答案:

答案 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!)
  • 请考虑,我们可能无法说,每个mime类型都有默认扩展名。例如:谁为jpg(或jpeg或JPG ..)图像定义了默认扩展名?

答案 2 :(得分:0)

MimeMagic

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

require 'mimemagic'
MimeMagic.new('image/jpeg').extensions.first #=> 'jpg'
# Note that this does not include the dot (.) in the extension.

TL;DR;

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 进行所有方向的转换:

  • content > Mime 类型
  • Mime 类型 > 扩展
  • 扩展 > Mime 类型

不同的结果

我切换的主要原因是将 application/xml 翻译为扩展名时的不同:

MimeMagic.new('application/xml').extensions #=> ["xml", "xbl", "xsd", "rng"]
Rack::Mime::MIME_TYPES.invert['application/xml'] #=> ".xsl"

突然间我看到一些 xml 文件以 .xsl 扩展名保存。