2012-07-23 30 views
6

Tôi đang thêm video do người dùng tải lên vào trang web RoR của tôi với sự trợ giúp của đá quý kẹp giấy và bộ nhớ s3. Vì một số lý do mà tôi không thể tìm ra, bất cứ khi nào người dùng tải lên tệp mp4, s3 đặt loại nội dung cho tệp đó là application/mp4 thay vì video/mp4.đặt loại nội dung cho tệp mp4 trên s3

Lưu ý rằng tôi đã đăng ký loại mp4 kịch câm trong một tập tin khởi tạo:

Mime::Type.lookup_by_extension('mp4').to_s => "video/mp4"

Dưới đây là phần có liên quan của mô hình bài viết của tôi:

has_attached_file :video, 
       :storage => :s3, 
       :s3_credentials => "#{Rails.root.to_s}/config/s3.yml", 
       :path => "/video/:id/:filename" 

    validates_attachment_content_type :video, 
    :content_type => ['video/mp4'], 
    :message => "Sorry, this site currently only supports MP4 video" 

tôi đang thiếu gì trong kẹp giấy của tôi và/hoặc s3 thiết lập.

#### Update #####

Đối với một số lý do đó là ngoài kiến ​​thức của tôi về Rails, kiểu MIME mặc định của tôi cho mp4 file chứa như sau:

MIME::Types.type_for("my_video.mp4").to_s 
=> "[application/mp4, audio/mp4, video/mp4, video/vnd.objectvideo]" 

Vì vậy, khi kẹp giấy gửi một tập tin mp4 để s3, có vẻ như để xác định loại mime của tập tin như là mặc định đầu tiên, "ứng dụng/mp4". Đó là lý do tại sao s3 xác định tệp là có loại nội dung là "application/mp4". Vì tôi muốn bật tính năng phát trực tiếp các tệp mp4 này, tôi cần kẹp giấy để xác định tệp có loại mime "video/mp4".

Có cách nào sửa đổi kẹp giấy (có thể trong bộ lọc before_post_process) để cho phép điều này hay có cách sửa đổi đường ray thông qua tệp init để xác định tệp mp4 dưới dạng "video/mp4". Nếu tôi có thể làm một trong hai, cách nào là tốt nhất.

Cảm ơn sự giúp đỡ của bạn

+0

Đã có một vấn đề tương tự với tải lên .svg. Điều này đã khắc phục được sự cố của tôi:: s3_headers => {"Content-Type" => "image/svg + xml"} – DavidMann10k

Trả lời

7

Bật ra rằng tôi cần thiết để đặt mặc định s3 header content_type trong mô hình. Đây không phải là giải pháp tốt nhất cho tôi bởi vì tại một số điểm tôi có thể bắt đầu cho phép các thùng chứa video khác với mp4. Nhưng nó khiến tôi chuyển sang vấn đề tiếp theo.

has_attached_file :video, 
       :storage => :s3, 
       :s3_credentials => "#{Rails.root.to_s}/config/s3.yml", 
       :path => "/video/:id/:filename", 
       :s3_headers => { "Content-Type" => "video/mp4" } 
1

tôi đã làm như sau:

... 
MIN_VIDEO_SIZE = 0.megabytes 
MAX_VIDEO_SIZE = 2048.megabytes 
VALID_VIDEO_CONTENT_TYPES = ["video/mp4", /\Avideo/] # Note: The regular expression /\Avideo/ will match anything that starts with "video" 

has_attached_file :video, { 
    url: BASE_URL, 
    path: "video/:id_partition/:filename" 
} 

validates_attachment :video, 
    size: { in: MIN_VIDEO_SIZE..MAX_VIDEO_SIZE }, 
    content_type: { content_type: VALID_VIDEO_CONTENT_TYPES } 

before_validation :validate_video_content_type, on: :create 

before_post_process :validate_video_content_type 

def validate_video_content_type 
    if video_content_type == "application/octet-stream" 
    # Finds the first match and returns it. 
    # Alternatively you could use the ".select" method instead which would find all mime types that match any of the VALID_VIDEO_CONTENT_TYPES 
    mime_type = MIME::Types.type_for(video_file_name).find do |type| 
     type.to_s.match Regexp.union(VALID_VIDEO_CONTENT_TYPES) 
    end 

    self.video_content_type = mime_type.to_s unless mime_type.blank? 
    end 
end 
... 
Các vấn đề liên quan