7

ペーパークリップジェムとs3ストレージを使用して、ユーザーがアップロードしたビデオをRoRsサイトに追加しています。なんらかの理由で、ユーザーがmp4ファイルをアップロードするたびに、s3はそのファイルのcontent-typeを。application/mp4の代わりに設定しますvideo/mp4

イニシャライザファイルにmp4mimeタイプを登録したことに注意してください。

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

これが私の投稿モデルの関連部分です:

  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のセットアップに何が欠けていますか。

####アップデート#####

Railsの知識を超えている何らかの理由で、mp4に含まれるファイルのデフォルトのmimeタイプは次のとおりです。

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

したがって、ペーパークリップがmp4ファイルをs3に送信すると、ファイルのmimeタイプが最初のデフォルトの「application/mp4」として識別されるように見えます。そのため、s3はファイルを「application/mp4」のコンテンツタイプを持つものとして識別します。これらのmp4ファイルのストリーミングを有効にしたいので、ファイルが「video/mp4」のmimeタイプであることを識別するためにペーパークリップが必要です。

これを可能にするためにペーパークリップを変更する方法(おそらくbefore_post_processフィルターで)がありますか、またはmp4ファイルが「video/mp4」であることを識別するためにinitファイルを介してレールを変更する方法があります。私がどちらかを行うことができれば、どちらの方法が最善です。

ご協力いただきありがとうございます

4

2 に答える 2

9

モデルにデフォルトの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" }
于 2012-07-26T19:06:14.067 に答える
2

私は次のことをしました:

...
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
...
于 2014-06-12T16:56:05.840 に答える