---
title: Shrine 2.8.0
---

## New Features

* The `rack_response` plugin now supports [range requests] via the `:range`
  parameter.

```rb
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.

```rb
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.

```rb
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.

```rb
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
end
```

* 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.

[range requests]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests
