2016-01-31 2 views
3

В моем приложении у меня уже есть скрепка для загрузки изображений, но требование изменилось, чтобы принимать как изображения, так и видео. Изображения уже определены в модели с отношением belongs_to, которое называется Attachment. Поскольку видео будет также вложением одной и той же родительской модели (в моем случае, статьях), я хотел повторно использовать ту же модель Attachment для изображений & видео. Это хорошая идея?Скрепка для обоих изображений и видео

Код моего attachment.rb является:

class Attachment < ActiveRecord::Base 

    belongs_to :article 

    has_attached_file :url, :s3_protocol => :https , 
    styles: { 
     medium: "300x300>", thumb: "100x100>", big: "1200x1200>", normal: "600x600>" 
    } 

    validates_attachment_content_type :url, content_type: /\Aimage|\Avideo\/.*\Z/ 

    validates_attachment :url, content_type: { content_type: ["image/jpeg", "image/gif", "image/png", "video/mp4"] } 

end 

Но, как это, он не сохраняет видео на S3. Я получаю следующее в терминале

Command :: file -b --mime '/var/folders/v_/pf2bsxnj1y37ccd2pjksv7z80000gn/T/f3e2afc957bb9fb2aa3e77e69359c48920160131-13311-pyeez1.mp4' 
Command :: identify -format '%wx%h,%[exif:orientation]' '/var/folders/v_/pf2bsxnj1y37ccd2pjksv7z80000gn/T/8dc7385648e2164764b72fda6fd9099a20160131-13311-1l40ccn.mp4[0]' 2>/dev/null 
[paperclip] An error was received while processing: #<Paperclip::Errors::NotIdentifiedByImageMagickError: Paperclip::Errors::NotIdentifiedByImageMagickError> 
Command :: identify -format '%wx%h,%[exif:orientation]' '/var/folders/v_/pf2bsxnj1y37ccd2pjksv7z80000gn/T/8dc7385648e2164764b72fda6fd9099a20160131-13311-1l40ccn.mp4[0]' 2>/dev/null 
[paperclip] An error was received while processing: #<Paperclip::Errors::NotIdentifiedByImageMagickError: Paperclip::Errors::NotIdentifiedByImageMagickError> 
Command :: identify -format '%wx%h,%[exif:orientation]' '/var/folders/v_/pf2bsxnj1y37ccd2pjksv7z80000gn/T/8dc7385648e2164764b72fda6fd9099a20160131-13311-1l40ccn.mp4[0]' 2>/dev/null 
[paperclip] An error was received while processing: #<Paperclip::Errors::NotIdentifiedByImageMagickError: Paperclip::Errors::NotIdentifiedByImageMagickError> 
Command :: identify -format '%wx%h,%[exif:orientation]' '/var/folders/v_/pf2bsxnj1y37ccd2pjksv7z80000gn/T/8dc7385648e2164764b72fda6fd9099a20160131-13311-1l40ccn.mp4[0]' 2>/dev/null 
[paperclip] An error was received while processing: #<Paperclip::Errors::NotIdentifiedByImageMagickError: Paperclip::Errors::NotIdentifiedByImageMagickError> 
Command :: file -b --mime '/var/folders/v_/pf2bsxnj1y37ccd2pjksv7z80000gn/T/f3e2afc957bb9fb2aa3e77e69359c48920160131-13311-kvb5nr.mp4' 

Второй вопрос, поскольку я использую AngularJS для фронтэнда, я могу просто воспользоваться HTML <video> тег для отображения видео пользователя?

+0

Как вы транскодирование видео? –

ответ

4

Похоже, что проблема заключается в том, что ImageMagick пытается сделать transcode видео, которое не может.

Способ обработки транскодирования видео в пределах Paperclip предназначен для использования драгоценного камня paperclip-av-transcoder (ранее paperclip-ffmpeg). У меня есть только опыт последнего:

#app/models/attachment.rb 
class Attachment < ActiveRecord::Base 
    has_attached_file :url, :s3_protocol => :https , 
     styles: lambda { |a| a.instance.is_image? ? medium: "300x300>", thumb: "100x100>", big: "1200x1200>", normal: "600x600>" } : {:thumb => { :geometry => "100x100#", :format => 'jpg', :time => 10}, :medium => { :geometry => "300x300#", :format => 'jpg', :time => 10}}}, processors: [:transcoder] 

    validates_attachment :url, 
     content_type: ['video/mp4'], 
     message:  "Sorry, right now we only support MP4 video", 
     if:   :is_video? 

    validates_attachment :url, 
     content_type: ['image/png', 'image/jpeg', 'image/jpg', 'image/gif'], 
     message:  "Different error message", 
     if:   :is_image? 

    private 

    def is_video? 
    url.instance.attachment_content_type =~ %r(video) 
    end 

    def is_image? 
    url.instance.attachment_content_type =~ %r(image) 
    end 
end 

Our old code & ref

Смежные вопросы