回形针:PDF缩略图在S3上有错误的content_type

时间:2010-11-17 10:01:21

标签: ruby-on-rails ruby amazon-s3 paperclip

我在Rails应用程序中使用Paperclip 2.3.5在Amazon S3上存储PDF文档。对于每个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(你可以在S3上看到一个带有S3探索工具的文件的content_type,比如Cyber​​duck )。对于原始PDF文件,此content_type是正确的,但不适用于缩略图。这会导致某些浏览器(例如Chrome或Safari)出现问题,而这些浏览器不会内嵌缩略图。

注意:存储在我的数据库中的content_type(字段“file_content_type”)是“application / pdf”,这仍然是正确的,因为它是原始文件的content_type。

如果缩略图的content_type应该与原始文件不同,我如何覆盖它?

3 个答案:

答案 0 :(得分:3)

这就是我们在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 :(得分:1)

我必须克服这个问题,而不是最优雅的解决方案,但我将Paperclip分叉并在我自己的git repo中保存补丁 - https://github.com/svetzal/paperclip

它是Paperclip的直接替代品,只需放入您的环境.rb

gem'twm_paperclip',:lib => '纸夹'

答案 2 :(得分:0)

这在paperclip> = 2.7中得到修复,如下所示:

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

写入S3的文件的mime-type在上传前具体确定。