Skip to content
Guides · Téléversement de médias

Téléversement de médias

Envoyez des images, vidéos et audio locaux vers AllToken via des téléversements pré-signés directs vers R2.


Vue d'ensemble

La génération vidéo et l'édition d'images utilisent toutes deux des ressources média — images de référence, vidéo et audio de référence, images source et masques. Il n'existe qu'une seule règle pour les envoyer :

  • La ressource est déjà sur l'internet public (votre CDN / stockage objet) — transmettez directement son URL http(s), sans aucun surcoût de téléversement. Matériaux de référence vidéo uniquement.
  • La ressource est locale — téléversez-la d'abord via un téléversement pré-signé direct vers R2, puis référencez l'upload_id retourné. C'est la seule voie pour les fichiers locaux, et la seule voie pour l'édition d'images (source et masque).

Avertissement

La méthode base64 data: intégrée a été supprimée le 2026-08-06 pour les matériaux de référence vidéo, comme du côté image (dont l'ancien téléversement multipart avait déjà été supprimé). Les médias locaux passent désormais toujours par un téléversement pré-signé.

Le point de terminaison est POST https://api.alltoken.ai/v1/uploads/presign (uploads au pluriel). Ne le confondez pas avec le /upload/presign du service de compte, réservé aux avatars du site et qui n'accepte que les types MIME image.

Choisir votre voie

Votre situationVoiePourquoi
Matériau de référence vidéo déjà sur votre CDN / OSSTransmettre urlAucun téléversement — les octets ne touchent jamais notre passerelle ni notre stockage
Matériau de référence vidéo en local (image / vidéo / audio)Téléversement pré-signéLa seule voie pour les fichiers locaux
Source et masque d'édition d'images (/images/edits, /images/variations)Téléversement pré-signéLe seul point d'entrée, quelle que soit la taille du fichier

Le téléversement en trois étapes

Votre fichier ne transite jamais par notre passerelle. Vous obtenez une URL de téléversement direct à usage unique, vous envoyez les octets bruts par PUT directement vers le stockage objet, puis vous référencez l'upload_id retourné lors de la création de la tâche. La passerelle ne transporte qu'un identifiant de quelques dizaines d'octets. Le même mécanisme sert aux matériaux de référence vidéo et à l'édition d'images — seuls le purpose et le champ par lequel vous le référencez diffèrent.

Étape 1 — demander une URL de téléversement direct :

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

Corps : purpose (détermine le MIME et la taille autorisés — voir ci-dessous), content_type (le MIME du fichier, en minuscules), content_length (nombre exact d'octets), content_md5 et checksum_sha256.

Avertissement

Les deux empreintes utilisent des encodages différents : content_md5 est en base64, checksum_sha256 est en hex. Les intervertir est rejeté dès l'étape de pré-signature avec un 400.

La réponse retourne upload_id (commence par upl_), upload_url (la cible PUT pré-signée), required_headers (à rejouer tels quels à l'étape 2), expires_in (validité de l'URL, 300 s), claim_expires_at (validité de l'upload_id, 2 h) et max_content_length.

Étape 2 — envoyez les octets bruts par PUT vers upload_url, en rejouant exactement chaque en-tête de required_headers. Le corps correspond aux octets bruts du fichier — ni base64, ni multipart :

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

Avertissement

Supprimez ou modifiez un en-tête requis et le stockage objet retourne 403 — l'URL pré-signée signe aussi ces en-têtes. N'ajoutez pas de Content-Encoding, ne compressez pas en gzip, n'utilisez pas multipart.

Étape 3 — créez la tâche en référençant upload_id. La vidéo le place dans content[].upload_id ; l'édition d'images utilise les champs de premier niveau image_upload_id / mask_upload_id. La passerelle valide le nombre d'octets et l'ETag, déplace l'objet vers la zone permanente de la tâche et soumet une adresse accessible en amont — le tout de manière transparente pour vous ; vous obtenez simplement 202 + task_id.

Trois règles à retenir :

  • upload_id et le champ URL sont mutuellement exclusifs au sein d'un même élément — remplir les deux retourne 400 upload_url_conflict.
  • La pré-signature et la création de la tâche doivent utiliser la même API Key — la propriété est vérifiée comme (utilisateur + API Key + purpose) ; changer de clé retourne 404 upload_not_found.
  • Le purpose doit correspondre à l'usage réel, sinon vous obtenez également 404 upload_not_found.

Les tableaux complets des champs de requête et de réponse figurent dans les références API Image et API Vidéo.

Référence des purpose

Chaque purpose fixe les types MIME autorisés et un plafond de taille par fichier.

purposeUtilisé pourMIME autorisésPlafond par fichier
video_input_imageImage de référence vidéo / trame de début & de finimage/png, image/jpeg, image/webp, image/gif20 MiB
video_input_videoVidéo de référence vidéovideo/mp4, video/quicktime, video/webm100 MiB
video_input_audioAudio de référence vidéoaudio/wav, audio/mpeg, audio/mp4, audio/aac, audio/ogg20 MiB
image_edit_sourceSource d'édition d'imagesimage/png, image/jpeg, image/webp25 MiB
image_edit_maskMasque d'édition d'imagesimage/png, image/webp (pas de jpeg)25 MiB
image_variation_sourceSource de variation d'imagesimage/png, image/jpeg, image/webp25 MiB

Les masques rejettent image/jpeg car le canal alpha exprime « où modifier », et jpeg n'a pas de transparence.

Fenêtres temporelles et quotas

FenêtreDuréeAprès expiration
upload_url (la cible PUT)5 minutesPUT retourne 403 — pré-signez à nouveau
upload_id (le jeton de la ressource)2 heuresLa création de la tâche retourne 409 upload_expired

Donc : téléversez dès que vous avez l'URL, mais vous disposez ensuite de deux heures pour assembler et soumettre la requête de génération.

Un upload_id se lie à exactement une tâche ; sa réutilisation retourne 409 upload_already_used. C'est voulu — une ressource, une tâche, une facture. Si la création de la tâche échoue, l'objet temporaire est récupéré automatiquement.

QuotaSeuilEn cas de dépassement
upload_id inutilisés simultanément100429 quota_exceeded
Total d'octets téléversés par jour UTC2 GiB429 quota_exceeded

Le rythme normal « téléverser puis utiliser » ne les atteint jamais. Pour les gros lots d'édition d'images, surveillez le plafond quotidien : 25 MiB × ~80 fichiers atteignent 2 GiB.

Codes d'erreur de téléversement

Étape de pré-signature :

HTTPcodeSignification
400invalid_purposepurpose mal orthographié ou non pris en charge
400invalid_content_typeMIME absent de la liste blanche du purpose (un masque envoyé en jpeg atterrit ici)
400invalid_content_md5Le MD5 n'est pas un base64 valide (n'envoyez pas de hex)
400invalid_checksumLe SHA-256 n'est pas un hex minuscule de 64 caractères (n'envoyez pas de base64)
413payload_too_largecontent_length dépasse le plafond du purpose
429quota_exceededPlus de 100 en attente, ou plus de 2 GiB aujourd'hui
503storage_unavailableStockage temporairement indisponible — réessayez

Étape de liaison (lors de la création de la tâche) :

HTTPcodeSignification
404upload_not_foundupload_id inconnu, mauvaise API Key ou purpose non concordant
409upload_already_usedDéjà lié à une tâche — pré-signez à nouveau
409upload_expiredPlus de 2 heures — pré-signez à nouveau
400upload_object_missingPré-signé mais jamais envoyé par PUT avant la création de la tâche
400upload_size_mismatchLes octets réels diffèrent de content_length
409upload_modifiedObjet modifié après le téléversement (ETag non concordant)
400upload_url_conflictupload_id et un champ URL renseignés dans un même élément