同じにやっても動かない

書いてある通りやっているのに動かないのです

Dragonflyでファイルが本当に画像ファイルかチェックしたい

Dragonflyのドキュメントを見ると、ファイルの拡張子を見て画像ファイルかを判断しvalidationを行う例が載っています

例えばモデルにこの様に設定すると、指定拡張子のファイル以外はvalidationエラーとなります。

  validates_property :format, :of => :photo_image, :in => [:jpeg, :jpg, :png, :gif], :case_sensitive => false

これってファイルの中身まで見て判断しているのか、それとも拡張子名だけで判断しているのか知りたかったので、適当なテキストファイルの拡張子をpngに変えて登録してみました。

Validationエラーは出ず、しっかり登録されてしまいました。


画像ファイルの中身が壊れていたりということもあると思うので、ファイルのフォーマットをチェックしてくるメソッドがないかなあと思って、Documentを漁っていた所、さすがです、しっかり用意してあります。

def image?(temp_object)
  !!catch(:unable_to_handle){ identify(temp_object) }
end

ImageMagickのidentifyコマンドを使用しているので、ちゃんと中身を見ています。

textファイルの拡張子をpngに変更したファイルを登録し、コンソールで試してみたらバッチリでした。
※ image_file、dummy_fileとも拡張子はpngファイルですが、dummy_fileの中身はテキストです。

> rails c
irb(main):002:0> image_file = Photo.find(:correct_image_file_id)
irb(main):003:0> image_file.photo_image.image?
=> true
irb(main):002:0> dummy_file = Photo.find(:dummy_file_id)
irb(main):003:0> dummy_file.photo_image.image?
=> false

というわけで、こんな感じのValidationにすることとします。

  validates_property :format, :of => :photo_image, :in => [:jpeg, :jpg, :png, :gif], :case_sensitive => false
  validates_property :image?, :of => :photo_image, :in => [true]