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