File Validation
Shrine allows validating assigned files using the validation
plugin. Validation code is defined inside an Attacher.validate
block:
Shrine.plugin :validation
class ImageUploader < Shrine
Attacher.validate do
# ... perform validation ...
end
end
The validation block is run when a new file is assigned, and any validation
errors are stored in Shrine::Attacher#errors
. Persistence plugins like
sequel
and activerecord
will automatically merge these validation errors
into the #errors
hash on the model instance.
photo = Photo.new
photo.image = image_file
photo.valid? #=> false
photo.errors[:image] #=> [...]
Validation helpers
The validation_helpers
plugin provides convenient
validators for built-in metadata:
Shrine.plugin :validation_helpers
class ImageUploader < Shrine
Attacher.validate do
validate_size 1..5*1024*1024
validate_mime_type %w[image/jpeg image/png image/webp image/tiff]
validate_extension %w[jpg jpeg png webp tiff tif]
end
end
Note that for secure MIME type validation it's recommended to also load
determine_mime_type
and restore_cached_data
plugins.
See the validation_helpers
plugin documentation for
more details.
Custom validations
You can also do your own custom validations:
# Gemfile
gem "streamio-ffmpeg"
require "streamio-ffmpeg"
class VideoUploader < Shrine
plugin :add_metadata
add_metadata :duration do |io|
movie = Shrine.with_file(io) { |file| FFMPEG::Movie.new(file.path) }
movie.duration
end
Attacher.validate do
if file.duration > 5*60*60
errors << "duration must not be longer than 5 hours"
end
end
end
Inheritance
Validations are inherited from superclasses, but you need to call them manually when defining more validations:
class ApplicationUploader < Shrine
Attacher.validate { validate_max_size 5*1024*1024 }
end
class ImageUploader < ApplicationUploader
Attacher.validate do
super() # empty parentheses are required
validate_mime_type %w[image/jpeg image/png image/webp]
end
end
Removing invalid files
By default, an invalid file will remain assigned after validation failed, but
you can have it automatically removed and deleted by loading the
remove_invalid
plugin.
Shrine.plugin :remove_invalid # remove and delete files that failed validation