2012-07-23 13 views
6

Estoy agregando videos cargados por el usuario a mi sitio RoRs con la ayuda de la gema paperclip y almacenamiento s3. Por alguna razón que no puedo entender, cada vez que un usuario carga un archivo mp4, s3 establece el tipo de contenido para ese archivo como application/mp4 en lugar de video/mp4.configuración del tipo de contenido para archivos mp4 en s3

Tenga en cuenta que me he registrado tipo mp4 mimo en un fichero de inicialización:

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

Aquí está la parte correspondiente de mi modelo de la publicación:

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" 

¿Qué me falta en mi clip y/o s3 setup.

#### Actualización #####

Por alguna razón que está más allá de mi conocimiento de los carriles, mis tipos MIME predeterminados para mp4 archivos contenidos es el siguiente:

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

Por lo tanto, cuando paperclip envía un archivo mp4 a s3, parece identificar el tipo de mime del archivo como el primer valor predeterminado, "application/mp4". Es por eso que s3 identifica el archivo como un tipo de contenido de "aplicación/mp4". Como quiero habilitar la transmisión de estos archivos mp4, necesito un clip para identificar el archivo que tiene un tipo de mime de "video/mp4".

Hay una forma de modificar paperclip (tal vez en un filtro before_post_process) para permitir esto, o hay una manera de modificar los rieles a través de un archivo init para identificar los archivos mp4 como "video/mp4". Si pudiera hacer cualquiera de los dos, cuál es el mejor.

Gracias por su ayuda

+0

tenido un problema similar con archivos .svg. Esto solucionó mis problemas:: s3_headers => {"Content-Type" => "image/svg + xml"} – DavidMann10k

Respuesta

7

Resulta que necesitaba para establecer una cabecera content_type s3 por defecto en el modelo. Esta no es la mejor solución para mí porque en algún momento podría comenzar a permitir contenedores de video distintos de mp4. Pero me lleva al próximo problema.

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

hice lo siguiente:

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