Paperclip设置了错误的content_type和文件名

时间:2014-07-01 20:35:39

标签: ruby-on-rails ruby-on-rails-3 paperclip

我有一个带有多种样式的照片附件,所有样式都将图像转换为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.pngimage/png,而在S3上则存储为JPG。当我查询照片的网址时,也会返回正确的JPG网址。

因此,虽然一切正常,但令我困扰的是,不正确的信息存储在数据库中。

2 个答案:

答案 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