2010-03-10 12 views
9

W mojej aplikacji Rails Próbuję uzyskać typ MIME pliku tak:szyn: kwestie typu MIME z plikami M4V

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

Ale to nie uznając go.

Próbowałem dodanie następujących do config/initializers/mime_types.rb (i ponownym uruchomieniu serwera) bez powodzenia:

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

+0

Co 'to nie uznając oznacza it'? –

+0

Znaczenie nic nie jest zwracane, gdy robię "type_for" jak w moim przykładzie powyżej. Inne rozszerzenia (.mov, .mp3, itp.) Zwracają typ fine. – Shpigford

+0

Czy masz pewność, że typ MIME jest wysyłany przez przeglądarkę? Ponieważ jeśli nie jest wysyłany przez twoją przeglądarkę, nie możesz jej użyć w swoim Railsowym APP – shingara

Odpowiedz

8

Trzeba dodać następujące linie do pliku 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))) 

Teraz w konsoli można przetestować wyniki

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

Idealny! Dzięki! – Shpigford

+0

Jeden problem ... Dostaję to teraz, gdy uruchamiam mój serwer: 'Wpisz video/mp4 już zarejestrowane jako wariant wideo/mp4' – Shpigford

+0

@Shpigford - czy kiedykolwiek zastanawiałeś się, jak wyłączyć tę wiadomość? –

0

Więc myślę, że jest Mime :: Rodzaj i MIME :: typy, które są całkowicie oddzielone od siebie inny. Zauważ, że jest to "Mime" vs "MIME".

Na przykład

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

powraca

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

Jednak

Mime::Type.lookup_by_extension("json") 

zwraca

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

Wygląda więc na to, czy chcesz dodać typ tak że jest ona zwracana przy użyciu type_for można użyć następujących:

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

ostrzeżenie, gdy dodatek jest nazywany jest trochę dotycząca więc powinieneś dowiedzieć się, w jaki sposób dołączyć rozszerzenie do typu "video/mp4". Aby uzyskać więcej informacji, zapoznaj się z dokumentacją dla MIME::Types i MIME::Type.

+0

Ale tutaj pytanie brzmi: jak mogę dodać niestandardowy typ MIME, aby rozpoznano rozszerzenie .m4v (jak na mój oryginalny przykład). – Shpigford

+0

Zaktualizowałem swoją odpowiedź, dodając kod do dodawania niestandardowego typu MIME. Nie jestem ekspertem w tej dziedzinie, ale mam nadzieję, że to pomaga. –