Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
1 contributor

Users who have contributed to this file

113 lines (90 sloc) 2.58 KB
title
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
You can’t perform that action at this time.