我有一个使用Paperclip 2.3.8的Rails 3应用程序。我在我的模型中指定了以下内容:
validates_attachment_content_type :file,
:content_type => ['image/jpeg', 'image/png', 'image/gif',
'image/pjpeg', 'image/x-png'],
:message => 'Not a valid image file.'
但是,当我测试虚假上传时,而不是“不是有效的图像文件”。我收到这个奇怪的错误消息:
/var/folders/cs/cs-jiL3ZH1WOkgLrcqa5Ck+++TI/-Tmp-/stream20110404-43533-vm7eza.pdf
is not recognized by the 'identify' command.
任何想法在这里出了什么问题?
- 编辑 -
对于它的价值,我已经从评论中提到的类似问题中覆盖了ImageMagick / Rmagick的步骤(谢谢fl00r!)。
我发现的一件事(现在我正在追踪它是一个ImageMagick错误)是我在这个图像附件上有一个水印处理器。
所以,也许它试图在尝试验证之前尝试使用水印处理器,并且 是错误消息的来源?
- 编辑 -
我尝试删除处理器并且没有更改错误消息...所以,不确定接下来要尝试什么。
- 编辑 -
:)按照要求,这是整个模型。
require 'paperclip_processors/watermark'
class Attachment < ActiveRecord::Base
# RELATIONSHIPS
belongs_to :photo
belongs_to :user
has_attached_file :file,
:processors => [:watermark],
:styles => {
:full => "960",
:half => "470",
:third => "306",
:fourth => "225",
:fifth => "176x132#",
:tile => "176x158>",
:sixth => "145x109#",
:eighth => "106x80#",
:tenth => "87x65#",
:marked => { :geometry => "470",
:watermark_path => "#{Rails.root}/public/images/watermark.png",
:position => 'Center' }
},
:storage => :s3,
:s3_credentials => "#{Rails.root}/config/s3.yml",
:path => "photos/:user_id/:id/:username_:id_:style.:extension"
# VALIDATIONS
validates_attachment_presence :file
validates_attachment_content_type :file,
:content_type => ['image/jpeg', 'image/png', 'image/gif',
'image/pjpeg', 'image/x-png'],
:message => 'Not a valid image file.'
validate :file_dimensions, :unless => "errors.any?"
# CUSTOM VALIDATIONS
def file_dimensions
dimensions = Paperclip::Geometry.from_file(file.to_file(:original))
self.width = dimensions.width
self.height = dimensions.height
if dimensions.width < 1600 && dimensions.height < 1600
errors.add(:file,'Width or height must be at least 1600px')
end
end
# MAINTENANCE METHODS
def self.orphans
where( :photo_id => nil )
end
end
答案 0 :(得分:5)
我想我发现了问题。
尝试从模型中删除:styles
,您会看到'identify' error message
已经开始,模型会按预期验证。
问题是Paperclip正在处理样式,即使content_type
验证失败了。它会尝试将您的PDF格式作为图像处理,然后您会收到错误:
/var/folders/cs/cs-jiL3ZH1WOkgLrcqa5Ck+++TI/-Tmp-/stream20110404-43533-vm7eza.pdf
is not recognized by the 'identify' command.
解决方案是在验证失败时跳过处理,方法是将其添加到您的模型中:
before_post_process :skip_if_invalid
def skip_if_invalid
return false unless self.valid?
end
这样Paperclip就不会尝试将不是图像的文件转换为缩略图:)
答案 1 :(得分:0)
这不奇怪。这是回形针最常见的错误。实际上,这不是关于回形针,而是关于ImageMagick。
如果你现在已经错过了IM,请查看其位置:
which identify
#=> it will return some path
在Rails应用程序config/initializers/paperclip.rb
中创建新文件:
Paperclip.options[:command_path] = "path/to/identify"
您还可以在:whiny => false
has_attached_file
选项
has_attached_file :picture, :styles => { ... }, :whiny => false
因此,如果出现问题,它不会抛出任何错误
如果您想将图片和文件存储在一个模型中并想要忽略非图像文件的样式,也可以在此处阅读: