Странное сообщение об ошибке скрепки - PullRequest
3 голосов
/ 05 апреля 2011

У меня есть приложение Rails 3, использующее Paperclip 2.3.8.В моей модели указано следующее:

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

Ответы [ 2 ]

5 голосов
/ 13 августа 2012

Кажется, я понял проблему.

Попробуйте удалить :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 не будет пытаться превратить файлы, которые не являются изображениями, в миниатюры:)

0 голосов
/ 05 апреля 2011

это не странно. Это самая популярная ошибка для скрепки. И дело даже не в скрепке, а в ImageMagick.

  1. Вы установили ImageMagick ?
  2. Вы добавили image_magick command_path через инициализатор?

Если вы установили 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

Таким образом, он не выдаст никаких ошибок, если что-то пойдет не так

Также вы можете прочитать здесь, если вы хотите хранить изображения и файлы в одной модели и хотите игнорировать стили для файлов, не относящихся к изображениям:

Только изображения процесса скрепки

...