2012-07-23 10 views
6

Aggiungo i video caricati dall'utente al mio sito RoRs con l'aiuto di paperclip gem e s3 storage. Per qualche ragione che non riesco a capire, ogni volta che un utente carica un file mp4, s3 imposta content-type per quel file come application/mp4 invece di video/mp4.impostazione del tipo di contenuto per i file mp4 su s3

Nota che ho registrato tipo mp4 mimo in un file di inizializzazione:

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

Ecco la parte rilevante del mio modello 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" 

Quello che mi manca nella mia graffetta e/o s3 set-up.

#### Aggiornamento #####

Per qualche ragione che va oltre la mia conoscenza di Rails, i miei tipi MIME di default per i file MP4 contenute sono le seguenti:

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

Quindi, quando paperclip invia un file mp4 a s3, sembra identificare il tipo di mime del file come il primo predefinito, "application/mp4". Ecco perché s3 identifica il file come avente un tipo di contenuto di "application/mp4". Perché voglio abilitare lo streaming di questi file mp4, ho bisogno di paperclip per identificare il file con un tipo mime di "video/mp4".

C'è un modo per modificare paperclip (magari in un filtro before_post_process) per consentirlo, oppure c'è un modo per modificare i binari attraverso un file di init per identificare i file mp4 come "video/mp4". Se potessi fare entrambi, qual è il modo migliore.

Grazie per il vostro aiuto

+0

avuto un problema simile con i caricamenti .svg. Questo ha risolto i miei problemi:: s3_headers => {"Content-Type" => "image/svg + xml"} – DavidMann10k

risposta

7

Risulta che avevo bisogno di impostare un valore predefinito s3 intestazione content_type nel modello. Questa non è la soluzione migliore per me perché a un certo punto potrei iniziare a consentire contenitori video diversi da mp4. Ma mi fa passare al prossimo 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

ho fatto la seguente:

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