2011-04-04 125 views
3

我有一個使用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 
+1

可能重複的[rails paperclip和passenger'不能被'identify'命令識別](http://stackoverflow.com /問題/ 1996102/Rails的回形針和-過時nger-is-not-recognized-by-the-identify-command) – fl00r 2011-04-04 22:43:17

+0

我在這個映像文件上有一個處理器 - 這可能是錯誤所在嗎? – Andrew 2011-04-04 22:55:13

+0

顯示你的整個模型 – fl00r 2011-04-04 23:11:44

回答

5

我想我找出了問題所在。

嘗試從您的模型中刪除:styles,您將看到'identify' error message正常運行並且模型按預期進行驗證。

問題是回形針正在處理樣式,即使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 

這樣回形針將不會嘗試將不是圖像的文件變成縮略圖:)

+1

偉大的捕獲,復活這個問題的方式! – Andrew 2012-08-12 23:12:09

0

這並不奇怪。這是回形針最常見的錯誤。這實際上不是關於回形針,而是關於ImageMagick。

  1. 您是否安裝了ImageMagick
  2. 您是否通過初始化程序添加了image_magick command_path?

如果您istalled IM poperly現在籤的位置:

Paperclip.options[:command_path] = "path/to/identify" 

你也可以添加:whiny => false選項,您has_attached_file

which identify 
#=> it will return some path 

在Rails應用程序config/initializers/paperclip.rb創建新文件

has_attached_file :picture, :styles => { ... }, :whiny => false 

所以,如果出了問題也不會拋出任何錯誤

此外,如果你想存儲的照片和文件在一個模型中,並希望忽略非圖像文件的造型,你可以在這裏閱讀:

Paperclip process images only

+0

嗯,我確實有ImageMagick,我使用'which identify'檢查了路徑,並且向初始化程序添加了命令路徑選項並重新啓動了服務器,但那並沒有解決錯誤...此外,它似乎並不適用於我的生產環境(Heroku),以及如何解決該問題的想法? – Andrew 2011-04-04 22:49:48

+0

只是設置':whiny => false' – fl00r 2011-04-04 22:50:44

+0

此外,在查看您發佈的其他問題時,我的gemfile中也有'rmagick'。 – Andrew 2011-04-04 22:51:47