我有一个带有多种样式的照片附件,所有样式都将图像转换为jpg,例如:
styles: { original: { geometry: "1500x1500>", format: :jpg},
large: { geometry: "1000x1000>", format: :jpg } }
该模型还有一个before_post_process
,可将照片的文件名重命名为标准名称:
def rename_photo
extension = File.extname(photo_file_name).downcase
self.photo.instance_write :file_name, "original#{extension}"
end
这很好用:我上传的任何内容都会被转换并以JPG
的形式上传到AWS S3。
但是,如果图像为PNG
,则其file_name和content_type相应地存储在db中original.png
和image/png
,而在S3上则存储为JPG
。当我查询照片的网址时,也会返回正确的JPG
网址。
因此,虽然一切正常,但令我困扰的是,不正确的信息存储在数据库中。
答案 0 :(得分:0)
我正在处理旧的rails 2.3代码,并且必须将Paperclip从2.3.1.1升级到2.7.5并且我有同样的问题。在2.3.1.1中,一切都运作良好多年。我有一种调整大小并转换为png的样式。在2.3.1.1中,无论原始文件(jpg,gif,png)上的扩展名如何,Paperclip都会将我的样式化图像文件保存为png,如我所要求的那样。当我要求转换后的图像的网址时,网址中文件的扩展名已正确设置为png。所有这些都与原始图像的扩展无关。
在Paperclip 2.7.5中,我未触摸的has_attached_file选项保存带有与原始文件相同扩展名的样式化图像文件,并且对样式化图像文件的url请求也返回,扩展名设置与原始文件相同。
我观察了由paperclip调用的ImageMagick convert命令来创建样式化图像,它正确地引用了一个用于转换和输出的png文件。我还以十六进制的形式查看了样式化图像的内容,并将其格式化为png文件(原始版本为jpg)。所以似乎Paperclip的转换工作并没有给样式化的图像提供png的扩展,就像以前一样。
has_attached_file :image,
:storage => :s3,
:s3_credentials => Application.s3_credentials,
:s3_protocol => 'https',
:path => "home_pages/:id/images/:basename-:style.:extension",
:default_style => '450',
:styles => { '450' => ['450x253>', :png] }
不幸的是,我不能在此时花费资源来重写我们的Rails 4应用程序,所以我被困在暮光之城区域。我必须升级到应用于Rails 2.3的最后一个paperclip版本的原因是我可以升级aws-sdk gem以使用Amazon AWS的一些新功能。
有没有人经历过这个并且可能想出了一个问题?
答案 1 :(得分:0)
在深入研究PaperClip 2.7.5的源代码之后,我想出了一个适合我的解决方案。将其添加到应用程序中的config / initializers / paperclip.rb。
# In Paperclip 2.3.1.1 to 2.7.5 (maybe more) the extension method fails to
# return the extension of an attachment with a style that has a 'format'.
module Paperclip
module Interpolations
def extension attachment, style_name
style = attachment.styles[style_name.to_s] || attachment.styles[style_name.to_s.to_sym]
style && style[:format] ? style[:format].to_s : File.extname(attachment.original_filename).gsub(/^\.+/, '')
end
end