CodamAIDocs
Themafertig

Herunterladen

Wie GET /{id}/file funktioniert, warum das Token hier in der URL steht und welche Rechte und Grenzen gelten.

Ausprägungen
normales Datei-Modell: GET /{id}/fileSingleton: GET /fileaccess_token in der URLPrüfungen: Token, Lesen, Download-RolleAntwort-Header

Worum es geht

Den Datensatz eines Datei-Modells liest du wie jedes Objekt. Den Inhalt holst du mit einem eigenen Endpunkt:

Anfrage
GET /api/rest/fileasset/f1…/file?access_token=eyJhbGciOi…
Antwort
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

GET /fileasset/{id}/file
  1. CIAS
    Token
    Ist das Token aus access_token gültig, wird sein Mandant bedient, und nennt es in MULTI überhaupt einen Mandanten?
    ↳ nein 403 mit dem Schlüssel aus CIAS, ohne Mandanten in MULTI cias.authentication.tenant-required wie in der Filterkette; ein unlesbares Token zählt als anonym und scheitert an der nächsten Station
  2. CDMS
    Datensatz lesen
    Leserolle des Modells und Sichtbarkeit der Zeile, wie bei POST /read/{id}
    ↳ nein 403 ohne Leserolle, 404 wenn unsichtbar oder nicht vorhanden
  3. CDMS
    Download-Rolle
    Hast du die Download-Rolle des Modells?
    ↳ nein abgelehnt
  4. File storage
    Inhalt
    Liegt der Inhalt unter der fileId, und ist er lesbar?
    ↳ nein file-not-found oder file-not-readable
  5. 200 mit den Bytes

Die Antwort

HeaderWertWirkung
Content-TypemimeType des Datensatzesder Browser weiß, wie er die Datei darstellt
Content-Dispositioninline; filename=<name>der Browser zeigt die Datei an, wenn er kann, und schlägt beim Speichern den Namen vor
Cache-Controlno-storeBrowser 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

Wie heruntergeladen wird

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

Quellen im Code und in der Wissensdatenbank
  • CDMS/cdms-generator – ApiProcessor.getDownloadMethod, ApiSingletonProcessor.getDownloadMethod, AbstractProcessor.isDownloadExposed
  • CDMS/cdms-rest-api – QueryTokenAuthentication, AbstractRestApi.downloadFile, AbstractRestSingletonApi.downloadFile
  • CDMS/cdms-system-layer – AbstractLayer.downloadFile (downloadAccessAllowedByClass)
  • CDMS/cdms-localfs-storage – LocalFSFileController.getFile (file-not-found, file-not-readable); docs/04-file-operations.md
Suchen