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

title: Shrine 2.8.0

New Features

  • The rack_response plugin now supports range requests via the :range parameter.

status, headers, body = uploaded_file.to_rack_response(range: "bytes=100-200")
status                    #=> 206
headers["Content-Length"] #=> "101"
headers["Content-Range"]  #=> "bytes 100-200/1000"
body                      # partial content
  • The Shrine::Storage::S3.clear! method now accepts a block for filtering which objects to delete.

s3 = Shrine::Storage::S3.new(...)
# deletes all objects that were uploaded more than 7 days ago
s3.clear! { |object| object.last_modified < Time.now - 7*24*60*60 }

Other improvements

  • The download_endpoint plugin now automatically handles range requests. This allows browsers/tools to automatically resume interrupted downloads when requesting the file from download_endpoint.

  • Shrine::UploadedFile#open and Shrine::UploadedFile#download now accept additional arguments and forwards them to #open and #download methods on the storage. This allows storage objects to accept additional options on those methods and customize their functionality.

  • Shrine::Storage::S3#open and Shrine::Storage::S3#download now accept additional options which are forwarded to Aws::S3::Client#get_object.

  • The direct_upload plugin now works with Roda 3.

  • The metadata_attributes plugin now supports specifying full column names by using strings instead of symbols.

plugin :metadata_attributes, filename: :original_filename  # uses the "<attachment>_original_filename" column
# VS
plugin :metadata_attributes, filename: "original_filename" # uses the "original_filename" column
  • You can now specify metadata mappings on metadata_attributes plugin initialization.

class MyUploader < Shrine
  # before you needed to do this:
  plugin :metadata_attributes
  metadata_attributes filename: :filename, mime_type: :type

  # but now you can also do this:
  plugin :metadata_attributes, filename: :filename, mime_type: :type
  • The generated upload location will now always have the file extension in lowercase format, even if the original file extension was uppercased.

  • Shrine::UploadedFile#extension will now always return the extension in lowercase format, even if the uploaded file ID or original filename have the extension uppercased.

  • Added support for file types which might have magic bytes farther than in the first 256 KB when using :file analyzer in determine_mime_type plugin.

  • The :filemagic analyzer in determine_mime_type plugin now closes the FileMagic descriptor even in case of exceptions.

  • Fixed logging plugin not working with :json format when ActiveSupport is loaded.

  • Shrine::Storage::FileSystem now expands relative directory paths on initialization, which means that Shrine::Storage::FileSystem#directory and Shrine::Storage::FileSystem#path will now always return absolute paths. This fixes Shrine not working with Rails applications running in detached mode when Shrine::Storage::FileSytem was initialized with a relative directory path.

Backwards compatibility

  • aws-sdk 2.x has been deprecated in favour of the new aws-sdk-s3 gem. Starting with Shrine 3 only aws-sdk-s3 will be supported.

  • The file extension has been normalized to lowercase format, both when generating the upload location and in Shrine::UploadedFile#extension. If you were relying on the previous behaviour of keeping the original casing of the file extension you will need to update your code.