Rails:如何根据MIME类型获取文件扩展名/后缀

22

我想问的问题是,Ruby on Rails是否有类似于以下函数的功能:

file_content_type = MIME::Types.type_for(file).first.content_type

有没有一个函数可以返回特定MIME类型的文件扩展名或后缀?比如我传入'image/jpeg',这个函数会返回'jpg'

想要一种比编写case语句更简洁的编码方式来完成相同的工作。

5个回答

47

Rack::Mime 具备这种能力(而Rack是Rails的依赖项):

Rack::Mime 有这个能力(而 Rack 是 Rails 的依赖库):

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

如果您经常需要进行查找操作,建议将反转后的哈希表进行备忘录处理,因为它不是一项廉价的操作。


6

我发现这篇文章并进行了更新,以下是更好的答案。

Mime::Type.lookup('image/jpeg').symbol.to_s
# => "jpg"

1
Mime::Type.lookup doesn't recognise application/vnd.openxmlformats-officedocument.wordprocessingml.document as being docx - Jakob Cosoroaba
1
好知道,为了明确rack/mime的作用,我进行了测试以验证。所以这可能更全面一些吧? - jrochkind

0

Marcel也可以是你的选择。

它随Rails(ActiveStorage gem)一起发送。

https://github.com/rails/marcel

它将MimeType表的哈希值转换成扩展名。

您不必自己反转哈希值,这可能更有利于内存。

请注意,它的常量是私有的,并且在将来的版本中可能会更改。

https://github.com/rails/marcel/blob/main/lib/marcel/tables.rb#L1261

iirb(main):008:0> Marcel::TYPES["image/jpeg"]
=>
[["jpg", "jpeg", "jpe", "jif", "jfif", "jfi"],
 [],
 "Joint Photographic Experts Group"]


0
如果您正在使用ActiveStorage,Rails已经提供了一个方便的方法,因此您不需要自己查找mime类型。例如,对于具有附加图像的Post模型:
class Post < ApplicationRecord

  has_one_attached :image

您可以使用:

post_instance.image.blob.filename.extension

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接