Developer Blog deltacity

ActiveStorage ab rails 5.2 - die beste Lösung für Datei-Uploads?

In diesem Post wollen wir auf das neue Upload-Framework Active Storage eingehen. Dieses ist ab rails 5.2 nun standardmäßig mit dabei.  Active Storage wurde aus Basecamp 3 extrahiert und ist nun in rails integriert. Den Praxis-Test hat das neue Modul somit bereits bestanden.

Wer sich bislang mit File-Uploads in rails beschäftigt hat wird sicherlich schon mal etwas von paperclip, carrierwave oderdragonfly gehört haben. Mit diesen gems ließ sich bislang der File-Upload in rails einfach handhaben.

Auch wir haben bereits alle gems eingesetzt. Gestartet sind wir mit paperclip. Da wir auch mehrsprachige Uploads unterstützen wollten, sind wir in den entsprechenden Projekten carrierwave gewechselt. Für ein Projekt haben wir auch dragonfly eingesetzt, um das Feature “on-the-fly processing” zu nutzen. Dabei hatte jedes gem seine gewissen Vor- und Nachteile.

Active Storage ist perfekt für die Cloud vorbereitet. Die Integration von Amazon S3, Google Cloud Storage und Microsoft Azure Cloud File Storage ist bereits vorhanden. Standardmäßig werden die Dateien lokal gespeichert. Die Konfiguration von Active Support erfolgt über eine YAML-Datei (storage.yml) im config Verzeichnis. Dabei kann ein Dienst als Hauptdienst angelegt werden und eine Spiegelung für weitere Dienste eingerichtet werden.

Für Active Storage werden 2 ActiceRecord models benutzt -  ActiveStorage::Attachment und  ActiveStorage::Blob  Die benötigten Migrations können mit rails active_storage:install&nbspin die eigene Anwendung (nach-) installiert werden.

Mithilfe des gems  mini_magick  können Bilder on the fly manipuliert werden. Dabei werden alle Transformationen von mini_magick unterstützt. 
Üblicherweise wird eine andere Größe oder ein anderes Seitenverhältnis für eine Thumbnail-Darstellung benötigt.

Aufbau & Einbindung

Die Dateien werden als Blob angelegt. Das  Attachment  hat eine polymorphe Beziehung zu dem eigentlich Objekt sowie eine Beziehung zum  Blob  Beim Blob werden automatisch der Dateiname, Datei-Typ, Datei-Größe und eine Checksum gespeichert. Zudem können zusätzliche meta-Daten gespeichert werden. Da beim  Attachment auch der entsprechend eingetragene Name (z.B. avatar) gespeichert wird, ist es möglich mehrere, unterschiedliche Dateien für ein Model hochzuladen.

ActiveStorage bietet zwei Optionen für die Einbindung in ActiveRecord-models an:  has_one_attached  für eine Datei und  has_many_attached für viele Dateien

class User

  has_one_attached :public_avatar

  has_one_attached :private_avatar

 

  has_many_attached :user_files

Ein direkter Upload der Bilder wird über die eigene activestorage.js Javascript-Bibliothek ermöglicht. Diese kann ganz einfach geladen werden, z.B. mithilfe der Asset-Pipeline in application.js:

//= require activestorage

Somit werden die Uploads außerhalb des eigentlichen POST-/PATCH-Requests mit einem PUT-Request an unsere rails-app geschickt.

Fazit

Für uns im Team ist ActiveStorage eine echte Alternative. Die ersten Examples waren vielversprechend und machen Freude auf mehr. Wir werden ActiveStorage in unseren nächsten Projekten einsetzen und sind gespannt wie es in der Community angenommen wird.