2010-03-10 15 views
9

En mi aplicación Rails que estoy tratando de obtener el tipo MIME de un archivo de este modo:Rieles: cuestiones de tipo MIME con .m4v

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

Pero no es reconocerlo.

He intentado añadir lo siguiente a config/initializers/mime_types.rb (y reiniciar el servidor) sin ninguna suerte:

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

+0

'¿Qué no está reconociendo it' significa? –

+0

Significa que no se devuelve nada cuando hago 'type_for' como en mi ejemplo anterior. Otras extensiones (.mov, .mp3, etc.) devuelven el tipo fino. – Shpigford

+0

¿Está seguro de que el navegador envía su tipo de mimo? Porque si su navegador no lo envía, no puede usarlo en su aplicación de Rails – shingara

Respuesta

8

Es necesario añadir las siguientes líneas a su archivo 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))) 

Ahora en la consola que puede poner a prueba los resultados

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

¡Perfecto! ¡Gracias! – Shpigford

+0

Un problema ... Ahora estoy obteniendo esto cuando inicio mi servidor: 'Escriba video/mp4 ya registrado como una variante de video/mp4' – Shpigford

+0

@Shpigford - ¿alguna vez descubrió cómo suprimir ese mensaje? –

0

así que creo que es Mime :: Tipo y MIME :: tipos que son totalmente independientes de cada uno otro. Tenga en cuenta que es "Mime" vs "MIME".

Por ejemplo,

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

rendimientos

[#<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">] 

Sin embargo,

Mime::Type.lookup_by_extension("json") 

devuelve

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

Así que parece que si desea añadir un tipo de modo que se devuelve cuando se utiliza type_for puede utilizar lo siguiente:

>> 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">] 
>> 

La advertencia cuando complemento se llama es un poco preocupante por lo que probablemente debería averiguar cómo para agregar su extensión al tipo "video/mp4". Para obtener más información, consulte la documentación para MIME::Types y MIME::Type.

+0

Pero la pregunta aquí es cómo puedo agregar un tipo MIME personalizado para que se reconozca la extensión .m4v (como en mi ejemplo original). – Shpigford

+0

Actualicé mi respuesta para incluir algún código sobre cómo agregar un tipo MIME personalizado. No soy un experto en esta área, pero espero que esto ayude. –