2010-03-10 30 views
9

Trong ứng dụng Rails của tôi, tôi đang cố gắng để có được những kiểu MIME của một tập tin như vậy:Rails: Loại MIME vấn đề với các tập tin m4v

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

Nhưng nó không nhận ra nó.

tôi đã cố gắng thêm dòng sau vào config/initializers/mime_types.rb (và khởi động lại máy chủ) mà không cần bất kỳ may mắn:

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

+0

gì 'nó không nhận ra it' nghĩa? –

+0

Có nghĩa là không có gì được trả về khi tôi làm 'type_for' như trong ví dụ trên. Các phần mở rộng khác (.mov, .mp3, v.v.) trả lại loại tiền phạt. – Shpigford

+0

Bạn có chắc chắn rằng loại mime được gửi bởi trình duyệt của bạn? Bởi vì nếu nó không được gửi bởi trình duyệt của bạn, bạn không thể sử dụng nó trong Rails APP của bạn – shingara

Trả lời

8

Bạn cần phải thêm những dòng sau vào tập tin config/initializers/mime_types.rb của bạn:

# 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))) 

Bây giờ trong giao diện điều khiển, bạn có thể kiểm tra kết quả

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

Hoàn hảo! Cảm ơn! – Shpigford

+0

Một vấn đề ... Bây giờ tôi nhận được điều này khi tôi khởi động máy chủ của mình: 'Loại video/mp4 đã được đăng ký dưới dạng một biến thể của video/mp4' – Shpigford

+0

@Shpigford - bạn đã bao giờ tìm ra cách để ngăn chặn thông điệp đó? –

0

Vì vậy, tôi nghĩ rằng đó là Mime :: Loại và MIME :: Các loại đó là hoàn toàn tách biệt với nhau khác. Lưu ý rằng đó là "Mime" và "MIME".

Ví dụ,

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

lợi nhuận

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

Tuy nhiên,

Mime::Type.lookup_by_extension("json") 

lợi nhuận

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

Vì vậy, nó trông như thế nào nếu bạn muốn thêm một loại để nó được trả về khi sử dụng type_for bạn có thể sử dụng như sau:

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

Cảnh báo khi add được gọi là một chút liên quan, do đó bạn có lẽ nên tìm ra cách để thêm phần mở rộng của bạn vào loại "video/mp4". Để biết thêm thông tin, hãy xem tài liệu về MIME::TypesMIME::Type.

+0

Nhưng câu hỏi ở đây là làm thế nào tôi có thể thêm một loại MIME tùy chỉnh để mở rộng .m4v được công nhận (theo ví dụ ban đầu của tôi). – Shpigford

+0

Tôi đã cập nhật câu trả lời của mình để bao gồm một số mã về cách thêm loại MIME tùy chỉnh. Tôi không phải là một chuyên gia trong lĩnh vực này nhưng hy vọng điều này sẽ giúp. –

Các vấn đề liên quan