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

```rb
plugin :backup, storage: :backup_store
```
```rb
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.

```rb
plugin :upload_options, store: ->(io, context) do
  if [:original, :thumb].include?(context[:version])
    {acl: "public-read"}
  else
    {acl: "private"}
  end
end
```

* The `keep_location` plugin has been added, which allows keeping file location
  when moving from cache to store, which can be useful when debugging.

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

user.save
user.avatar.storage_key #=> :store
user.avatar.id #=> "abc123.jpg"
```

* The `default_url` plugin has been added (extracted from the base
  functionality):

```rb
plugin :default_url do |context|
  "/#{context[:name]}/missing.jpg"
end
```
```rb
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.

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

[shrine-fog]: https://github.com/shrinerb/shrine-fog
[Fog]: https://github.com/fog/fog
[shrine-imgix]: https://github.com/shrinerb/shrine-imgix
[Imgix]: http://www.imgix.com
[shrine-cloudinary]: https://github.com/shrinerb/shrine-cloudinary
[Cloudinary]: http://cloudinary.com
[shrine-flickr]: https://github.com/shrinerb/shrine-flickr
[Flickr]: https://www.flickr.com
[shrine-gridfs]: https://github.com/shrinerb/shrine-gridfs
[GridFS]: https://docs.mongodb.org/v3.0/core/gridfs/
[shrine-sql]: https://github.com/shrinerb/shrine-sql
