Worum es geht
Den Datensatz eines Datei-Modells liest du wie jedes Objekt. Den Inhalt holst du mit einem eigenen Endpunkt:
GET /api/rest/fileasset/f1…/file?access_token=eyJhbGciOi…200
Content-Type: application/pdf
Content-Disposition: inline; filename=Vertrag.pdf
Cache-Control: no-store
…Bytes der Datei…Das Besondere: Das Token steht in der URL, im Parameter access_token, nicht im Authorization-Header.
Warum das Token in der URL steht
Ein Link <a href>, ein Bild <img src> oder ein PDF-Viewer im Browser holen eine Adresse selbst. Sie können keinen Authorization-Header mitschicken. Damit solche Links funktionieren, nimmt der Download-Endpunkt das Token als Parameter an, und nur so: Ohne access_token wird die Anfrage abgelehnt, auch wenn ein Header dabei ist.
sequenceDiagram
participant U as Benutzer
participant B as Browser
participant D as CDMS
participant F as Dateispeicher
U->>B: klickt auf "Vertrag.pdf"
B->>D: GET /fileasset/f1…/file?access_token=…
D->>D: Token prüfen (Mandant bedient?)
D->>D: Datensatz lesen: Leserolle, Sichtbarkeit
D->>D: Download-Rolle prüfen
D->>F: Inhalt lesen
F-->>D: Bytes
D-->>B: 200, Content-Type aus mimeType
B-->>U: zeigt die Datei an oder speichert sie
Die Prüfungen
-
CIASTokenIst das Token aus
access_tokengültig, wird sein Mandant bedient, und nennt es inMULTIüberhaupt einen Mandanten?↳ nein 403 mit dem Schlüssel aus CIAS, ohne Mandanten inMULTIcias.authentication.tenant-requiredwie in der Filterkette; ein unlesbares Token zählt als anonym und scheitert an der nächsten Station -
CDMSDatensatz lesenLeserolle des Modells und Sichtbarkeit der Zeile, wie bei
POST /read/{id}↳ nein 403 ohne Leserolle, 404 wenn unsichtbar oder nicht vorhanden -
CDMSDownload-RolleHast du die Download-Rolle des Modells?↳ nein abgelehnt
-
File storageInhaltLiegt der Inhalt unter der
fileId, und ist er lesbar?↳ neinfile-not-foundoderfile-not-readable - 200 mit den Bytes
Die Antwort
| Header | Wert | Wirkung |
|---|---|---|
Content-Type | mimeType des Datensatzes | der Browser weiß, wie er die Datei darstellt |
Content-Disposition | inline; filename=<name> | der Browser zeigt die Datei an, wenn er kann, und schlägt beim Speichern den Namen vor |
Cache-Control | no-store | Browser und Proxys legen die Datei nicht im Cache ab |
Soll der Browser die Datei immer speichern statt anzeigen, setze im Link das HTML-Attribut download: <a href="…/file?access_token=…" download>.
Varianten
Wann: GET {basis}/{id}/file?access_token=…
Wie oben: alle Prüfungen, Antwort mit Content-Type, Content-Disposition und Cache-Control.
Wann: GET {basis}/file?access_token=…, ohne id
Der Server findet das eine Objekt selbst. Gibt es noch keins, kommt 404 file-not-found. Geprüft wird nur die Download-Rolle, eine Leserolle ist hier nicht nötig. Die Antwort enthält nur die Bytes als application/octet-stream, ohne Dateinamen und ohne Dateityp.
Ergebnis: Siehe Singletons.
Wann: Die Datei hängt an einem anderen Objekt, etwa Company.logo.
Lies das Elternobjekt mit der id des Kindes, zum Beispiel "response": ["+", {"field": "logo", "response": ["id", "name"]}], und hole die Datei dann über den Endpunkt des Datei-Modells: GET /company/logo/{logoId}/file.
Den Endpunkt gibt es, sobald das Datei-Modell den Endpunkt DOWNLOAD oder READ hat. Siehe Welche Endpunkte ein Modell hat.
Fallen
Wie es weitergeht
- Die Datei austauschen: Ersetzen und Umbenennen
- Ältere Stände: Dateiversionen
- Das Token: Der Weg des Tokens