Вопрос по amazon-s3, ruby-on-rails, paperclip – установка типа контента для файлов mp4 на s3

6

Я добавляю загруженные пользователями видео на свой сайт RoRs с помощью скрепки для драгоценностей и хранилища s3. По какой-то причине, которую я не могу понять, всякий раз, когда пользователь загружает файл mp4, s3 устанавливает тип содержимого для этого файла какapplication/mp4 вместоvideo/mp4.

Обратите внимание, что я зарегистрировал тип mime mp4 в файле инициализатора:

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

Вот соответствующая часть моей модели Post:

  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"

Чего мне не хватает в моей скрепке и / или настройке s3.

####Update#####

По некоторым причинам, которые мне не известны в Rails, мои типы mime по умолчанию для файлов, содержащих mp4, следующие:

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

Таким образом, когда paperclip отправляет файл mp4 на s3, он, по-видимому, идентифицирует тип mime файла в качестве первого значения по умолчанию, «application / mp4». Вот почему s3 идентифицирует файл как имеющий тип контента «application / mp4». Поскольку я хочу включить потоковую передачу этих файлов mp4, мне понадобится скрепка, чтобы идентифицировать файл как имеющий тип MIME "video / mp4".

Есть ли способ изменить скрепку (может быть, в фильтре before_post_process), чтобы сделать это, или есть способ изменить рельсы через файл инициализации, чтобы идентифицировать файлы mp4 как "video / mp4". Если бы я мог сделать то, что лучше.

Спасибо за вашу помощь

Была похожая проблема с загрузками .svg. Это исправило мои проблемы:: s3_headers = & gt; {& quot; Тип содержимого & quot; = & GT; & Quot; изображение / SVG + XML & Quot; } DavidMann10k

Ваш Ответ

2   ответа
7

Оказывается, мне нужно было установить в модели заголовок s3 по умолчанию content_type. Это не лучшее решение для меня, потому что в какой-то момент я мог бы начать разрешать контейнеры видео, отличные от mp4. Но это заставляет меня перейти к следующей проблеме.

  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

Я сделал следующее:

...
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
...

Похожие вопросы