15

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

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

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

破解字符串

content_type.split("/")[1]

使用 MIME::Types

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

有更好的解决方案吗?

4

3 回答 3

20

您需要做的就是使用 ruby​​ 的Hash.invert方法。

这个答案显示了如何做到这一点:

Rack::Mime有这个能力(并且 Rack 是 Rails 的依赖项):

require 'rack/mime'
Rack::Mime::MIME_TYPES.invert['image/jpeg']  #=> ".jpg"

如果您要经常进行查找,您可能希望记住反向哈希,因为这不是一项廉价的操作。

从您的标签来看,您似乎仍然在使用导轨。

于 2016-03-07T00:32:36.850 回答
5

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

  • 第二种解决方案专为您的用例而设计
  • Hack the string可能不一致或返回意外结果(想想application/postscript有扩展名eps!)
  • 请考虑,我们可能不能说,每种 mime 类型都有它的默认扩展名。例如:谁定义了 jpg(或 jpeg 或 JPG..)图像的默认扩展名?
于 2013-02-08T10:46:37.700 回答
1

哑剧魔术

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

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

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'

我最近从Rack::Mime到 ,MimeMagic因为我还尝试从文件内容中检测 Mime 类型是什么。为了确保这是反向兼容的,我需要使用 MM 进行所有方向的转换:

  • 内容 > 哑剧类型
  • Mime 类型 > 扩展名
  • 扩展 > Mime 类型

不同的结果

我切换的主要原因是翻译application/xml为扩展时的差异:

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

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

于 2021-02-09T13:55:30.490 回答