Last Update: 2023-07-30 18:26:06 +0200

title: Shrine 1.1.0

New plugins

  • The download_endpoint plugin has been added, which allows downloading files that are otherwise unreachable by URL (e.g. file uploaded to database storages or the "tmp" directory), and also allows authenticating downloads.

  • The backup plugin has been added, which allows automatically backing up stored files upon upload.

plugin :backup, storage: :backup_store
User.create(avatar: image) # uploads to :store and :backup_store
  • The delete_uploaded plugin has been added for automatically deleting files after they're uploaded (useful for removing temporary files in versions).

  • The upload_options plugin has been added, for dynamically generating storage-specific upload options.

plugin :upload_options, store: ->(io, context) do
  if [:original, :thumb].include?(context[:version])
    {acl: "public-read"}
    {acl: "private"}
  • The keep_location plugin has been added, which allows keeping file location when moving from cache to store, which can be useful when debugging.

plugin :keep_location, :cache => :store
user = User.new
user.avatar = image
user.avatar.storage_key #=> :cache
user.avatar.id #=> "abc123.jpg"

user.avatar.storage_key #=> :store
user.avatar.id #=> "abc123.jpg"
  • The default_url plugin has been added (extracted from the base functionality):

plugin :default_url do |context|
user = User.new
user.avatar_url #=> "/avatar/missing.jpg"
  • The remove_invalid plugin has been added, for automatically deleting and deassigning cached files that were invalid.

New storages

  • The shrine-fog storage has been created for storing files on any of the cloud services supported by Fog.

  • The shrine-imgix storage has been created which intergrates with the Imgix service which provides on-the-fly processing.

  • The shrine-cloudinary storage as been created for storing files on Cloudinary, which supports upfront, eager and on-the-fly processing.

  • The shrine-flickr storage as been created for storing files on Flickr, which automatically generates various sizes of your photos upon upload.

  • The shrine-gridfs storage has been created for storing files in MongoDB using the GridFS data model.

  • The shrine-sql storage has been created for storing files in any SQL database.

New features

  • The S3 storage now accepts :upload_options for applying additional options on upload and presigning.

Shrine::Storage::S3.new(upload_options: {acl: "public-read"}, **s3_options)
  • The :max_size has been (re)added to direct_upload plugin, for limiting the maximum accepted filesize.

  • The data_uri plugin now adds UploadedFile#data_uri for returning a base64-encoded data URI representation of the file, and UploadedFile#base64 which returns base64-encoded contents of the file.

Other improvements

  • The backgrounding plugin is now compatible with ActiveJob.

  • The upload endpoint now returns the Roda class itself. This makes the endpoint customizable, inheritable and inspectable.

  • All files are now closed after they're uploaded, which should minimize the number of open file descriptors in the system.

  • Closed a temporary open file descriptor after downloading from FileSystem.

  • When an UploadedFile is reuploaded, any internal tempfiles will be deleted.

  • The S3 storage now properly copies files larger than 5 GB, by switching to multipart copy.

  • The S3 storage can now multi-delete more than 1000 files, by internally batching deletes in groups of 1000 (which is S3's maximum).

  • The S3 storage now accepts additonal per-upload options through the upload_options plugin.

  • The parallelize plugin will now properly work with moving when file is uploaded and deleted.

  • The around_* hooks now return the result of the corresponding operation.

  • Generating S3 presign now works properly when :endpoint option is passed in.

  • The data_uri plugin now accepts non-base64 data URIs as well.

  • The data_uri plugin now accepts MIME types with "+" symbols inside (e.g. "application/vnd.api+json")

  • Downloading file from a URL doesn't do an unnecessary copy of the file anymore.

  • Avoid an additional string allocation in S3#read.

  • UploadedFile#mime_type is now aliased to #content_type to play nice with some HTTP libraries when uploading.

  • The pretty_location plugin now generates shorter file IDs for better readability.

  • FileSystem#url should now work properly for Windows users.

  • The context hash can now be modified.

  • Storages aren't required to rewind the uploaded file anymore, since these files are now closed.

  • Improved storage linter to test the "special" storage methods as well if they're available.

Backwards compatibility

  • Files are now closed after they're uploaded by Shrine#upload, if you were relying on the previous behaviour you need to update your code.

  • The default URL functionality has been extracted into the default_url plugin, and overriding Shrine#default_url is now deprecated.

  • The :subdirectory FileSystem option has been renamed to :prefix, and the old option is now deprecated.

  • The background_helpers plugin has been renamed to backgrounding.

  • Shrine.direct_endpoint from the direct_upload plugin has been deprecated, you should use Shrine::UploadEndpoint instead.