我在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,比如Cyberduck )。对于原始PDF文件,此content_type是正确的,但不适用于缩略图。这会导致某些浏览器(例如Chrome或Safari)出现问题,而这些浏览器不会内嵌缩略图。
注意:存储在我的数据库中的content_type(字段“file_content_type”)是“application / pdf”,这仍然是正确的,因为它是原始文件的content_type。
如果缩略图的content_type应该与原始文件不同,我如何覆盖它?
答案 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在上传前具体确定。