2010-11-17 8 views
3

J'utilise Paperclip 2.3.5 dans une application Rails pour stocker des documents PDF sur Amazon S3. Pour chaque PDF, une vignette JPG est générée par ImageMagick. Im » utilisant cette configuration dans le modèle:Trombone: PDF thumbnail a un contenu de type incorrect sur S3

has_attached_file :file, 
        :styles => { :thumb => { :geometry => "200x200>", 
              :format => :jpg 
             } }, 
        :whiny => false, 
        :storage => :s3, 
        :s3_credentials => "#{RAILS_ROOT}/config/s3.yml", 
        :s3_permissions => 'authenticated-read', 
        :s3_headers => { 'Expires' => 1.year.from_now.httpdate }, 
        :url => "s3.amazonaws.com", 
        :path => "documents/:id/:style/:basename.:extension", 
        :bucket => 'mybucket' 

Mais il y a problème: La vignette générée est téléchargé sur S3 avec le content_type « application/pdf », ce qui est faux, parce qu'il est un JPG (vous pouvez voir la content_type d'un fichier sur S3 avec un outil d'exploration S3 comme Cyberduck). Pour le fichier PDF d'origine, ce type de contenu est correct, mais pas pour la vignette. Cela provoque des problèmes dans certains navigateurs (par exemple Chrome ou Safari) qui n'affichent pas la miniature en ligne.

Attention: Le type content_type stocké dans ma base de données (champ "file_content_type") est "application/pdf", ce qui est toujours correct, car c'est le type content_type pour le fichier original.

Comment puis-je remplacer le type_contenu d'une vignette si elle doit être différente du fichier d'origine?

+0

Cela ressemble à un bug dans Paperclip, pourquoi ne pas déposer un rapport de bogue sur ce problème? – Ariejan

+0

Était un bug trombone, la demande de traction a été fermée: https://github.com/thoughtbot/paperclip/pull/414 – MoMolog

Répondre

0

j'ai dû surmonter ce problème, pas la solution la plus élégante, mais je fourchue Paperclip et maintenir le patch dans mon propre git - https://github.com/svetzal/paperclip

Il est un remplacement direct pour Paperclip, il suffit de mettre dans votre environment.rb

bijou 'twm_paperclip',: lib => 'paperclip'

3

C'est ainsi que nous avons fixé sur brighterplanet.com/research, qui a des documents PDF et des aperçus: .png

has_attached :pdf_document, 
    :storage => :s3, 
    # [... other settings ...] 
    # PDFs work better in Windows 7/IE if you give them content-type: attachment 
    :s3_headers => { 'Content-Disposition' => 'attachment' }, 
    :styles => { :preview => { :geometry => '135', :format => :png } } 

after_save :fix_thumbnail 
def fix_thumbnail(force = false) 
    # application/pdf and application/x-pdf have both been seen... 
    return unless force or pdf_document_content_type.include?('pdf') 

    # set content type and disposition 
    s3 = AWS::S3.new(YAML.load(File.read("#{RAILS_ROOT}/config/aws_s3.yml"))) 
    t = s3.buckets[PAPERCLIP_BUCKET].objects[pdf_document.path(:thumbnail)] 
    content = t.read 
    t.write(:data => content, :content_type => 'image/png', :content_disposition => 'inline', :acl => :public_read) 

    nil 
end 
+0

Avait un problème similaire et cela a fonctionné pour moi. La seule différence était que je devais utiliser 'before _ # {attachment} _post_process' au lieu de' after_save'. – Zubin