Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 回形针设置的内容类型和文件名不正确_Ruby On Rails_Ruby On Rails 3_Paperclip - Fatal编程技术网

Ruby on rails 回形针设置的内容类型和文件名不正确

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

我有一个带有多种样式的照片附件,所有这些样式都将图像转换为jpg,例如:

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
。这就是问题所在。我知道这不是你想要的,但就我个人而言,如果“原始”文件名是原始的,我会更高兴。如果您需要具有该格式和几何图形的样式,那么只需创建一个
上传的
样式或其他东西,然后使用它即可。把你修改过的东西叫做“原创”肯定感觉不对。