Type Predicates | Shrine (original) (raw)

The type_predicates plugin adds predicate methods toShrine::UploadedFile based on the MIME type. By default, it uses theMiniMime gem for looking up MIME types.

# Gemfile
gem "mini_mime"
Shrine.plugin :type_predicates

General predicates

The plugin adds four predicate methods based on the general type of the file:

file.image? # returns true for any "image/*" MIME type
file.video? # returns true for any "video/*" MIME type
file.audio? # returns true for any "audio/*" MIME type
file.text?  # returns true for any "text/*" MIME type

If mime_type metadata value is nil, Shrine::Error will be raised.

Specific predicates

The UploadedFile#type? method takes a file extension, and returns whether themime_type metadata value of the uploaded file matches the MIME type associated to the given file extension.

file.type?(:jpg) # returns true if MIME type is "image/jpeg"
file.type?(:svg) # returns true if MIME type is "image/svg+xml"
file.type?(:mov) # returns true if MIME type is "video/quicktime"
file.type?(:ppt) # returns true if MIME type is "application/vnd.ms-powerpoint"
...

For convenience, you can create predicate methods for specific file types:

Shrine.plugin :type_predicates, methods: %i[jpg svg mov ppt]
file.jpg? # returns true if MIME type is "image/jpeg"
file.svg? # returns true if MIME type is "image/svg+xml"
file.mov? # returns true if MIME type is "video/quicktime"
file.ppt? # returns true if MIME type is "application/vnd.ms-powerpoint"

If mime_type metadata value is nil, or the underlying MIME type library doesn't recognize a given type, Shrine::Error will be raised.

MIME database

The MIME type lookup by file extension is done by the underlying MIME type library (MiniMime by default). You can change the MIME type library via the:mime plugin option:

Shrine.plugin :type_predicates, mime: :marcel # requires adding "marcel" gem to the Gemfile

The following MIME type libraries are supported:

Name Description
:mini_mime (Default.) Uses MiniMime gem to look up MIME type by extension.
:mime_types Uses mime-types gem to look up MIME type by extension.
:mimemagic Uses MimeMagic gem to look up MIME type by extension.
:marcel Uses Marcel gem to look up MIME type by extension.
:rack_mime Uses Rack::Mime to look up MIME type by extension.

You can also specify a custom block, which receives the extension and is expected to return the corresponding MIME type. Inside the block you can call into existing MIME type libraries:

Shrine.plugin :type_predicates, mime: -> (extension) do
  mime_type   = Shrine.type_lookup(extension, :marcel)
  mime_type ||= Shrine.type_lookup(extension, :mini_mime)
  mime_type
end