2012-07-23 7 views
6

私は、ユーザーのアップロードしたビデオをペーパークリップ宝石とs3ストレージの助けを借りて自分のRoRサイトに追加しています。何らかの理由で、ユーザーがmp4ファイルをアップロードするたびに、s3がそのファイルのコンテンツタイプをvideo/mp4の代わりにapplication/mp4と設定することがわかりません。私は初期化ファイルにMP4のMIMEタイプを登録しているs3の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のセットアップ。

#### Railsの私の知識を超えて、MP4のための私のデフォルトのMIMEタイプは、ファイルが含まれているいくつかの理由

#####アップデートは以下の通りです:

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」であることを識別するためにpaperclipが必要です。

これを可能にするためにpaperclip(おそらくbefore_post_processフィルタ)を修正する方法がありますか、または「ビデオ/ mp4」としてmp4ファイルを識別するためにinitファイルからレールを変更する方法があります。もし私がどちらかをすることができれば、どちらの方が最善かです。あなたの助け

+0

は.SVGアップロードで同様の問題がありました。これは私の問題を解決しました::s3_headers => {"Content-Type" => "image/svg + xml"} – DavidMann10k

答えて

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 
... 
関連する問題