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]