Ruby on rails 回形针设置的内容类型和文件名不正确
我有一个带有多种样式的照片附件,所有这些样式都将图像转换为jpg,例如:Ruby on rails 回形针设置的内容类型和文件名不正确,ruby-on-rails,ruby-on-rails-3,paperclip,Ruby On Rails,Ruby On Rails 3,Paperclip,我有一个带有多种样式的照片附件,所有这些样式都将图像转换为jpg,例如: styles: { original: { geometry: "1500x1500>", format: :jpg}, large: { geometry: "1000x1000>", format: :jpg } } 该模型还有一个before\u post\u过程,将照片的文件名重命名为标准名称: def rename_photo extension = File.extn
styles: { original: { geometry: "1500x1500>", format: :jpg},
large: { geometry: "1000x1000>", format: :jpg } }
该模型还有一个before\u post\u过程
,将照片的文件名重命名为标准名称:
def rename_photo
extension = File.extname(photo_file_name).downcase
self.photo.instance_write :file_name, "original#{extension}"
end
这很好:无论我上传什么,都会转换并作为JPG
上传到AWS S3。
但是,如果图像是PNG
的,则其文件名和内容类型将作为original.PNG
和image/PNG
存储在db中,而在S3上则作为JPG
存储。当我查询照片的url时,也会返回一个正确的JPG
url
因此,尽管一切正常,但数据库中存储的信息却不正确,这让我很困扰。我正在使用较旧的rails 2.3代码,不得不将回形针从2.3.1.1升级到2.7.5,我也遇到了同样的问题。在2.3.1.1中,每件事情都运行得很好。我有一个样式可以调整大小并转换为png。在2.3.1.1中,无论原始文件(jpg、gif、png)的扩展名是什么,回形针都会按照我的要求将我的样式图像文件保存为png。当我为转换后的图像请求url时,url中的文件扩展名被正确设置为png。所有这些都与原始图像的扩展无关 在回形针2.7.5中,“我的未接触的已附加文件”选项使用与原始文件相同的扩展名保存样式化图像文件,对样式化图像文件的url请求也会返回,扩展名设置与原始文件相同 我观察到ImageMagick convert命令,该命令由曲别针调用以创建样式化的图像,它正确地引用png文件进行转换和输出。我还以十六进制查看了样式化图像的内容,并将其格式化为png文件(原始是jpg)。因此,似乎通过回形针进行的转换并没有像过去那样赋予样式化图像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的应用程序,所以我被困在了暮色地带。我必须升级到paperclip的最新版本,该版本应该与Rails 2.3一起使用,原因是我可以升级aws sdk gem,以便使用Amazon aws的一些新功能
有没有人经历过这种情况,可能找到了解决方案?在深入研究了曲别针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
如果原始文件是PNG,将原始文件名存储为
original.PNG
,是否正确?还是我遗漏了什么?@Jon,我想把所有上传的图片都转换成JPG。回形针可以完美地转换所有内容,但在数据库中存储photo\u文件名
为original.png
和photo\u内容类型
为image/png
,即使文件现在已转换为JPG
。有趣的是,当我查询照片的url时,它会正确地将url返回到JPG
文件。回形针还存储原始上传文件的未修改副本,我怀疑它仍然是png。因此,原始文件名是正确的。如果您确实不希望以原始格式保存原始文件,则需要在“样式”散列中定义:original
的样式。但是要小心-如果您曾经因为添加了新样式而想重新处理所有附件,您将不再需要原始样式来执行此操作。@Jon,正如您从我发布的代码中看到的,我已经为:original
定义了一个样式,并且根据该代码,原件应转换为jpg
。事实上,原始文件被转换并存储为jpg
,但数据库中的信息表明它仍然是png
。这就是问题所在。我知道这不是你想要的,但就我个人而言,如果“原始”文件名是原始的,我会更高兴。如果您需要具有该格式和几何图形的样式,那么只需创建一个上传的
样式或其他东西,然后使用它即可。把你修改过的东西叫做“原创”肯定感觉不对。