【问题标题】:Paperclip sets incorrect content_type and file name回形针设置不正确的 content_type 和文件名
【发布时间】:2014-07-01 20:35:39
【问题描述】:

我有一个带有多种样式的照片附件,所有这些样式都将图像转换为 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,则其文件名和内容类型相应地以original.pngimage/png 存储在db 中,而在S3 上则存储为JPG。当我查询照片的 url 时,也会返回正确的 JPG url。

因此,尽管一切正常,但不正确的信息存储在数据库中,这让我很困扰。

【问题讨论】:

  • 如果原始文件是PNG,将原始文件名存储为original.png是否正确?还是我错过了什么?
  • @Jon,我想将所有上传的图片转换为 JPG。 Paperclip 可以完美地转换所有内容,但在数据库中将photo_file_name 存储为original.pngphoto_content_type 作为image/png,即使文件现在已转换为JPG。有趣的是,当我查询照片的 url 时,它会正确地将 url 返回到 JPG 文件。
  • Paperclip 还存储了原始上传文件的未修改副本,我怀疑它仍然是 png。因此,原始文件名是正确的。如果您真的不希望原件保存为 ORIGINAL 格式,则需要在“样式”哈希中为:original 定义样式。但请注意 - 如果您因为添加了新样式而想要重新处理所有附件,那么您将不再拥有原始附件。
  • @Jon,从我发布的代码中可以看出,我已经为:original 定义了一个样式,根据该代码,应该将原来的样式转换为jpg。事实上,原始文件被转换并存储为jpg,但数据库中的信息显示它仍然是png。因此问题。
  • 好吧,我知道这不是您要求的,但我个人会更高兴“原始”文件名是原始的。如果您需要具有该格式和几何形状的样式,则只需创建一个 uploaded 样式或其他东西并使用它。拥有你修改过的东西并称其为“原创”当然感觉不对。

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


【解决方案1】:

我正在处理旧的 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。当我询问转换后的图像的 url 时,url 中的文件扩展名被正确设置为 png。所有这些都与原始图像的扩展无关。

在 Paperclip 2.7.5 中,我未改动的 has_attached_file 选项将样式化图像文件保存为与原始文件具有相同扩展名,并且对样式化图像文件的 url 的请求也返回与原始文件设置相同的扩展名。

我观察到由回形针调用的 ImageMagick 转换命令来创建样式图像,它正确地引用了 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 一起使用的最后一个回形针版本的原因是我可以升级 aws-sdk gem 以使用 Amazon AWS 的一些新功能。

有没有人经历过这个,也许想出了一个解决方案?

【讨论】:

    【解决方案2】:

    在深入研究 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
    

    【讨论】:

      猜你喜欢
      • 2013-11-02
      • 2014-08-05
      • 2016-04-12
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      相关资源
      最近更新 更多