【问题标题】:Rails: MIME type issues with .m4v filesRails:.m4v 文件的 MIME 类型问题
【发布时间】:2011-01-25 17:57:05
【问题描述】:

在我的 Rails 应用程序中,我试图获取文件的 MIME 类型,如下所示:

MIME::Types.type_for("example.m4v").to_s

但它无法识别它。

我尝试将以下内容添加到config/initializers/mime_types.rb(并重新启动服务器),但没有任何运气:

Mime::Type.register "video/mp4", :m4v

【问题讨论】:

  • it's not recognizing it 是什么意思?
  • 当我执行 type_for 时没有返回任何内容,如我上面的示例所示。其他扩展名(.mov、.mp3 等)可以正常返回类型。
  • 您确定 mime-type 是由您的浏览器发送的吗?因为如果不是你的浏览器发送的,你就不能在你的Rails APP中使用它
  • 我的初始示例适用于几乎所有其他扩展。同样,如果我将上面的示例文件名更改为“example.mov”,那么 type_for 将返回 video/quicktime...我只需要添加一个自定义 MIME 类型,但不知道该怎么做。跨度>

标签: ruby-on-rails mime-types


【解决方案1】:

您需要将以下行添加到您的config/initializers/mime_types.rb 文件中:

# register MIME type with Rails 
Mime::Type.register "video/mp4", :m4v

# register MIME type with MIME::Type gem 
MIME::Types.add(MIME::Type.from_array("video/mp4", %(m4v)))

现在您可以在控制台中测试结果

MIME::Types.type_for("abc.m4v").to_s
#=> "video/mp4"

【讨论】:

  • 一个问题...我现在在启动服务器时遇到了这个问题:Type video/mp4 already registered as a variant of video/mp4
  • @Shpigford - 你有没有想过如何隐藏该消息?
【解决方案2】:

所以我认为 Mime::Type 和 MIME::Types 是完全独立的。请注意,它是“Mime”与“MIME”。

例如,

MIME::Types.type_for("foo.json") 

返回

 [#<MIME::Type:0x1038b3108 @system=nil, @encoding="8bit", @simplified="application/json", @sub_type="json", @registered=true, @url=["IANA", "RFC4627"], @docs=nil, @obsolete=nil, @extensions=["json"], @raw_sub_type="json", @media_type="application", @raw_media_type="application", @content_type="application/json">]

然而,

Mime::Type.lookup_by_extension("json")

返回

#<Mime::Type:0x1051c4d40 @symbol=:json, @string="text/x-json", @synonyms=[]>

所以看起来如果你想添加一个类型以便在使用 type_for 时返回它,你可以使用以下内容:

>> t = MIME::Type.from_array('video/mp4', %w(m4v))
=> #<MIME::Type:0x1055de3b8 @system=nil, @encoding="base64", @simplified="video/mp4", @sub_type="mp4", @registered=true, @url=nil, @docs=nil, @obsolete=nil, @extensions=["m4v"], @raw_sub_type="mp4", @media_type="video", @raw_media_type="video", @content_type="video/mp4">
>> MIME::Types.add(t)
Type video/mp4 already registered as a variant of video/mp4.
=> [#<MIME::Type:0x1055de3b8 @system=nil, @encoding="base64", @simplified="video/mp4", @sub_type="mp4", @registered=true, @url=nil, @docs=nil, @obsolete=nil, @extensions=["m4v"], @raw_sub_type="mp4", @media_type="video", @raw_media_type="video", @content_type="video/mp4">]
>> MIME::Types.type_for("example.m4v")
=> [#<MIME::Type:0x1055de3b8 @system=nil, @encoding="base64", @simplified="video/mp4", @sub_type="mp4", @registered=true, @url=nil, @docs=nil, @obsolete=nil, @extensions=["m4v"], @raw_sub_type="mp4", @media_type="video", @raw_media_type="video", @content_type="video/mp4">]
>>

调用 add 时的警告有点令人担忧,因此您可能应该弄清楚如何将扩展附加到“video/mp4”类型。有关更多信息,请查看 MIME::TypesMIME::Type 的文档。

【讨论】:

  • 但这里的问题是如何添加自定义 MIME 类型以便识别 .m4v 扩展名(根据我的原始示例)。
  • 我更新了我的答案以包含一些关于如何添加自定义 MIME 类型的代码。我不是这方面的专家,但希望这会有所帮助。
猜你喜欢
  • 2015-01-11
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
相关资源
最近更新 更多