Скрепка: у эскиза PDF неверный тип содержимого на S3 - PullRequest
3 голосов
/ 17 ноября 2010

Я использую Paperclip 2.3.5 в приложении Rails для хранения PDF-документов на Amazon S3.Для каждого PDF миниатюра JPG генерируется ImageMagick.Я использую эту конфигурацию в модели:

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'

Но есть проблема: созданный эскиз загружается на S3 с типом содержимого "application / pdf", который НЕПРАВИЛЬНЫЙ, потому что это JPG (вы можетесм. content_type файла на S3 с помощью инструмента исследования S3, такого как Cyberduck).Для исходного файла PDF этот тип содержимого правильный, но не для миниатюры.Это вызывает проблемы в некоторых браузерах (например, Chrome или Safari), которые не отображают миниатюру.

Осторожно: тип содержимого, хранящийся в моей базе данных (поле «file_content_type»), равен «application / pdf», чтовсе еще правильно, потому что это content_type для исходного файла.

Как я могу переопределить content_type для эскиза, если он должен отличаться от исходного файла?

Ответы [ 3 ]

3 голосов
/ 29 апреля 2011

Вот как мы это исправили на brighterplanet.com / research , в котором есть pdf документы и предварительные просмотры 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
1 голос
/ 28 ноября 2010

Мне пришлось преодолеть это, не самое элегантное решение, но я раздвоил Paperclip и держал патч в своем собственном git-репо - https://github.com/svetzal/paperclip

Это прямая замена Paperclip, просто поместите в вашу среду.rb

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

0 голосов
/ 21 января 2013

Это исправлено в скрепке> = 2.7, как вы можете видеть здесь:

https://github.com/thoughtbot/paperclip/blob/v2.7/lib/paperclip/storage/s3.rb#L290

тип MIME файла, который записывается на S3, определяется специально перед загрузкой.

...