Skip to content
Guides · Medien-Uploads

Medien-Uploads

Lokale Bilder, Videos und Audio per vorab signierten Direct-to-R2-Uploads an AllToken senden.


Überblick

Videoerzeugung und Bildbearbeitung nutzen beide Medien-Assets — Referenzbilder, Referenzvideos und -audio, Quellbilder und Masken. Für das Senden gibt es genau eine Regel:

  • Das Asset liegt bereits im öffentlichen Internet (Ihr CDN / Objektspeicher) — übergeben Sie direkt seine http(s)-URL, ganz ohne Upload-Overhead. Nur für Video-Referenzmaterialien.
  • Das Asset ist lokal — laden Sie es zuerst per vorab signiertem Direct-to-R2-Upload hoch und referenzieren Sie dann die zurückgegebene upload_id. Das ist der einzige Weg für lokale Dateien und der einzige Weg für die Bildbearbeitung (Quelle und Maske).

Warnung

Der Inline-Pfad data: (base64) wurde für Video-Referenzmaterialien am 2026-08-06 entfernt, passend zur Bildseite (deren veralteter multipart-Upload bereits früher entfernt wurde). Lokale Medien laufen jetzt immer über einen vorab signierten Upload.

Der Endpunkt ist POST https://api.alltoken.ai/v1/uploads/presign (Plural uploads). Verwechseln Sie ihn nicht mit /upload/presign des Account-Dienstes, das für In-Site-Avatare gedacht ist und nur Bild-MIME-Typen akzeptiert.

Den richtigen Weg wählen

Ihre SituationWegWarum
Video-Referenzmaterial liegt bereits auf Ihrem CDN / OSSurl übergebenKein Upload — die Bytes berühren weder unser Gateway noch unseren Speicher
Video-Referenzmaterial ist lokal (Bild / Video / Audio)Vorab signierter UploadDer einzige Weg für lokale Dateien
Quelle und Maske der Bildbearbeitung (/images/edits, /images/variations)Vorab signierter UploadDer einzige Einstiegspunkt, unabhängig von der Dateigröße

Der dreistufige Upload

Ihre Datei durchläuft niemals unser Gateway. Sie tauschen eine einmalige Direct-Upload-URL ein, übertragen die Rohbytes per PUT direkt in den Objektspeicher und referenzieren dann beim Erstellen der Aufgabe die zurückgegebene upload_id. Das Gateway transportiert nur eine wenige Dutzend Byte große ID. Derselbe Mechanismus bedient Video-Referenzmaterialien und Bildbearbeitung — es unterscheiden sich nur der purpose und das Feld, über das Sie darauf verweisen.

Schritt 1 — eine Direct-Upload-URL anfordern:

Presign
$POST https://api.alltoken.ai/v1/uploads/presign

Body: purpose (bestimmt die erlaubten MIME-Typen und die Größe — siehe unten), content_type (die Datei-MIME, kleingeschrieben), content_length (exakte Byte-Anzahl), content_md5 und checksum_sha256.

Warnung

Die beiden Prüfsummen verwenden unterschiedliche Kodierungen: content_md5 ist base64, checksum_sha256 ist hex. Sie zu vertauschen wird im Presign-Schritt mit einem 400 abgelehnt.

Die Antwort liefert upload_id (beginnt mit upl_), upload_url (das vorab signierte PUT-Ziel), required_headers (in Schritt 2 wortwörtlich wiederholen), expires_in (URL-Gültigkeit, 300 s), claim_expires_at (upload_id-Gültigkeit, 2 h) und max_content_length.

Schritt 2 — übertragen Sie die Rohbytes per PUT an upload_url und wiederholen Sie dabei jeden Header in required_headers exakt. Der Body sind die rohen Datei-Bytes — nicht base64, nicht multipart:

PUT to object storage
1PUT <upload_url>
2Content-Type: video/mp4
3Content-MD5: N0xUuLBP5C0uKJ2i0fA1kA==
4
5<raw bytes>

Warnung

Lassen Sie einen erforderlichen Header weg oder schreiben Sie ihn um, gibt der Objektspeicher 403 zurück — die vorab signierte URL signiert diese Header ebenfalls. Fügen Sie kein Content-Encoding hinzu, gzippen Sie nicht und verwenden Sie kein multipart.

Schritt 3 — erstellen Sie die Aufgabe mit Verweis auf upload_id. Video legt sie in content[].upload_id ab; die Bildbearbeitung verwendet die Top-Level-Felder image_upload_id / mask_upload_id. Das Gateway validiert die Byte-Anzahl und den ETag, verschiebt das Objekt in den permanenten Bereich der Aufgabe und übermittelt eine vom Upstream erreichbare Adresse — alles transparent für Sie; Sie erhalten einfach 202 + task_id.

Drei Regeln, die Sie sich merken sollten:

  • upload_id und das URL-Feld schließen sich innerhalb eines Elements gegenseitig aus — beides auszufüllen gibt 400 upload_url_conflict zurück.
  • Presign und Aufgabenerstellung müssen denselben API Key verwenden — die Zugehörigkeit wird als (Benutzer + API Key + purpose) geprüft; ein Schlüsselwechsel gibt 404 upload_not_found zurück.
  • Der purpose muss zur tatsächlichen Verwendung passen, sonst erhalten Sie ebenfalls 404 upload_not_found.

Vollständige Tabellen der Request- und Response-Felder finden Sie in der Image API- und Video API-Referenz.

purpose-Referenz

Jeder purpose legt die erlaubten MIME-Typen und eine Größenobergrenze pro Datei fest.

purposeVerwendet fürErlaubte MIMEObergrenze pro Datei
video_input_imageVideo-Referenzbild / erster & letzter Frameimage/png, image/jpeg, image/webp, image/gif20 MiB
video_input_videoVideo-Referenzvideovideo/mp4, video/quicktime, video/webm100 MiB
video_input_audioVideo-Referenzaudioaudio/wav, audio/mpeg, audio/mp4, audio/aac, audio/ogg20 MiB
image_edit_sourceQuelle der Bildbearbeitungimage/png, image/jpeg, image/webp25 MiB
image_edit_maskMaske der Bildbearbeitungimage/png, image/webp (kein jpeg)25 MiB
image_variation_sourceQuelle der Bildvariationimage/png, image/jpeg, image/webp25 MiB

Masken lehnen image/jpeg ab, weil der Alphakanal ausdrückt „wo geändert werden soll", und jpeg hat keine Transparenz.

Zeitfenster & Kontingente

FensterLängeNach Ablauf
upload_url (das PUT-Ziel)5 MinutenPUT gibt 403 zurück — erneut presignen
upload_id (der Asset-Anspruch)2 StundenAufgabenerstellung gibt 409 upload_expired zurück

Also: laden Sie hoch, sobald Sie die URL haben, danach haben Sie jedoch zwei Stunden Zeit, um die Generierungsanfrage zusammenzustellen und abzuschicken.

Eine upload_id bindet an genau eine Aufgabe; erneute Verwendung gibt 409 upload_already_used zurück. Das ist beabsichtigt — ein Asset, eine Aufgabe, eine Abrechnung. Schlägt die Aufgabenerstellung fehl, wird das temporäre Objekt automatisch zurückgewonnen.

KontingentSchwellenwertBei Überschreitung
Ungenutzte upload_id gleichzeitig100429 quota_exceeded
Gesamte hochgeladene Bytes pro UTC-Tag2 GiB429 quota_exceeded

Normales „hochladen, dann verwenden"-Timing trifft diese nie. Achten Sie bei großen Bildbearbeitungs-Stapeln auf die Tagesgrenze: 25 MiB × ~80 Dateien erreichen 2 GiB.

Upload-Fehlercodes

Presign-Phase:

HTTPcodeBedeutung
400invalid_purposepurpose falsch geschrieben oder nicht unterstützt
400invalid_content_typeMIME nicht in der Whitelist des purpose (eine als jpeg gesendete Maske landet hier)
400invalid_content_md5MD5 ist kein gültiges base64 (kein hex senden)
400invalid_checksumSHA-256 ist kein 64-stelliges hex in Kleinbuchstaben (kein base64 senden)
413payload_too_largecontent_length über der Obergrenze des purpose
429quota_exceededÜber 100 ausstehend oder über 2 GiB heute
503storage_unavailableSpeicher vorübergehend nicht verfügbar — erneut versuchen

Bindungsphase (wenn Sie die Aufgabe erstellen):

HTTPcodeBedeutung
404upload_not_foundUnbekannte upload_id, falscher API Key oder purpose-Konflikt
409upload_already_usedBereits an eine Aufgabe gebunden — erneut presignen
409upload_expiredÄlter als 2 Stunden — erneut presignen
400upload_object_missingPresigned, aber vor dem Erstellen der Aufgabe nie per PUT übertragen
400upload_size_mismatchTatsächliche Bytes weichen von content_length ab
409upload_modifiedObjekt nach dem Upload geändert (ETag-Konflikt)
400upload_url_conflictSowohl upload_id als auch ein URL-Feld in einem Element gesetzt