2010-03-10 9 views
9

Dans mon application Rails je suis en train d'obtenir le type MIME d'un fichier comme ceci:Rails: problèmes de type MIME avec .m4v

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

Mais ce n'est pas reconnaissant.

J'ai essayé d'ajouter ce qui suit à config/initializers/mime_types.rb (et redémarré le serveur) sans chance:

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

+0

Qu'est-ce que 'ce n'est pas reconnaître il s' signifie? –

+0

Ce qui signifie que rien n'est retourné quand je fais 'type_for' comme dans mon exemple ci-dessus. D'autres extensions (.mov, .mp3, etc) renvoient le type bien. – Shpigford

+0

Etes-vous sûr que mime-type est envoyé par votre navigateur? Parce que s'il n'est pas envoyé par votre navigateur, vous ne pouvez pas l'utiliser dans votre application Rails – shingara

Répondre

8

Vous devez ajouter les lignes suivantes à votre fichier 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))) 

maintenant dans la console, vous pouvez tester les résultats

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

Parfait! Merci! – Shpigford

+0

Un problème ... Je reçois maintenant quand je démarre mon serveur: 'Type vidéo/mp4 déjà enregistré comme une variante de la vidéo/mp4' – Shpigford

+0

@Shpigford - avez-vous déjà compris comment supprimer ce message? –

0

Je pense qu'il ya Mime :: Type et les types de MIME qui sont complètement séparés l'un de autre. Notez que c'est "Mime" vs "MIME".

Par exemple,

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

retours

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

Pourtant,

Mime::Type.lookup_by_extension("json") 

retours

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

Il semble donc que si vous voulez ajouter un type de sorte qu'il est retourné lors de l'utilisation type_for vous pouvez utiliser les éléments suivants:

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

L'avertissement lorsque add est appelé est un peu au sujet de sorte que vous devriez probablement savoir comment pour ajouter votre extension au type "video/mp4". Pour plus d'informations, consultez la documentation pour MIME::Types et MIME::Type.

+0

Mais la question ici est comment puis-je ajouter un type MIME personnalisé afin que l'extension .m4v est reconnue (selon mon exemple original). – Shpigford

+0

J'ai mis à jour ma réponse pour inclure du code sur la façon d'ajouter un type MIME personnalisé. Je ne suis pas un expert dans ce domaine mais j'espère que cela aide. –