Le téléchargement de fichiers via API est une nécessité technique courante pour les développeurs utilisant des interfaces de génération de vidéo par IA, de traitement d'images, etc. Cet article explique de manière systématique le fonctionnement du codage multipart/form-data, en s'appuyant sur l'exemple de l'API Sora 2 (Image-to-Video), pour vous aider à maîtriser cette compétence essentielle.
Valeur ajoutée : À la fin de cette lecture, vous comprendrez parfaitement le mécanisme sous-jacent du multipart/form-data, vous saurez utiliser la commande curl -F pour envoyer des fichiers et vous pourrez implémenter de manière autonome le téléchargement d'images pour des API d'IA comme Sora 2.

L'essentiel sur le téléchargement de fichiers par API
Avant de plonger dans le code, nous devons comprendre pourquoi le téléchargement de fichiers via API nécessite un mode de codage spécifique.
Pourquoi utiliser multipart/form-data ?
Lorsque vous envoyez des données textuelles simples via une API, vous pouvez utiliser le codage standard application/x-www-form-urlencoded. Cependant, cette méthode pose problème pour les fichiers :
| Type de codage | Scénario d'utilisation | Capacité de traitement de fichiers | Efficacité |
|---|---|---|---|
application/x-www-form-urlencoded |
Paires clé-valeur simples | ❌ Inadapté | Le binaire nécessite un échappement URL, peu efficace |
application/json |
Données structurées | ⚠️ Nécessite l'encodage Base64 | Augmentation de la taille de 33% |
multipart/form-data |
Téléchargement de fichiers | ✅ Support natif | Pas d'encodage requis, haute efficacité |
Le multipart/form-data est une solution proposée par la norme RFC 2388 en 1998 pour résoudre spécifiquement l'envoi mixte de données textuelles et binaires dans le protocole HTTP.
Fonctionnement du multipart/form-data
L'idée centrale du multipart/form-data est de diviser le corps d'une requête HTTP en plusieurs "parties" (parts) indépendantes, chacune pouvant avoir son propre type de contenu.

Détails de la structure de données
Une requête multipart/form-data typique se compose de la structure suivante :
POST /v1/videos HTTP/1.1
Host: api.apiyi.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxk
------WebKitFormBoundary7MA4YWxk
Content-Disposition: form-data; name="prompt"
She turns around and smiles
------WebKitFormBoundary7MA4YWxk
Content-Disposition: form-data; name="model"
sora-2-pro
------WebKitFormBoundary7MA4YWxk
Content-Disposition: form-data; name="input_reference"; filename="sample.jpeg"
Content-Type: image/jpeg
[Données d'image binaires]
------WebKitFormBoundary7MA4YWxk--
| Composant | Rôle | Exemple |
|---|---|---|
| Boundary | Identifiant unique séparant chaque partie de données | ----WebKitFormBoundary7MA4YWxk |
| Content-Disposition | Métadonnées décrivant la partie | form-data; name="prompt" |
| Content-Type | Type MIME de cette partie | image/jpeg |
| Body | Contenu réel des données | Texte ou données binaires |
🎯 Point technique : La "Boundary" doit être une chaîne de caractères unique qui ne risque pas de se retrouver dans le corps des données. Le serveur l'utilise pour analyser et isoler chaque segment d'information.
Détails de la commande curl -F : Pratique de l'upload de fichiers via API
curl est l'outil client HTTP en ligne de commande le plus utilisé, et son paramètre -F est spécifiquement conçu pour les requêtes multipart/form-data.
Syntaxe de base de curl -F
curl -F "字段名=值" URL
curl -F "文件字段=@本地文件路径" URL
| Forme du paramètre | Description | Exemple |
|---|---|---|
-F "key=value" |
Envoie un champ de texte classique | -F "prompt=Hello" |
-F "key=@file" |
Télécharge un fichier local | -F "[email protected]" |
-F "key=@file;type=mime" |
Spécifie le type MIME du fichier | -F "[email protected];type=image/jpeg" |
-F "key=@file;filename=new.jpg" |
Personnalise le nom du fichier téléchargé | -F "[email protected];filename=upload.jpg" |
Différence entre curl -F et les autres paramètres
Beaucoup de développeurs confondent souvent l'usage de -F, -d et -X POST :
# ❌ ERREUR : -d est utilisé pour x-www-form-urlencoded, pas adapté pour l'upload de fichiers
curl -X POST -d "[email protected]" https://api.example.com/upload
# ❌ ERREUR : Spécifier manuellement le Content-Type tout en utilisant -d
curl -X POST -H "Content-Type: multipart/form-data" -d "..." https://api.example.com/upload
# ✅ CORRECT : Utilisez -F pour définir automatiquement le bon Content-Type et le boundary
curl -F "[email protected]" https://api.example.com/upload
Note technique : En utilisant
-F, curl va automatiquement :
- Définir la méthode de requête sur POST.
- Configurer le
Content-Type: multipart/form-data.- Générer un
boundaryunique.- Formater le corps de la requête selon les standards RFC.
Cas pratique : Upload de fichiers avec l'API Sora 2
Sora 2 est le modèle de génération vidéo lancé par OpenAI, qui permet de générer des vidéos en téléchargeant une image de référence via API. C'est un cas d'école pour l'utilisation du multipart/form-data.
Paramètres de l'API Image-to-Video de Sora 2
| Paramètre | Type | Requis | Description |
|---|---|---|---|
prompt |
string | ✅ | Texte de description de la vidéo (invite) |
model |
string | ❌ | Choix du modèle : sora-2 ou sora-2-pro |
size |
string | ❌ | Résolution : 1280x720, 720x1280, 1024x1792, 1792x1024 |
seconds |
integer | ❌ | Durée : 4, 8, 12 secondes |
input_reference |
file | ❌ | Image de référence, utilisée comme première image de la vidéo |

Comparaison des modèles Sora 2
| Caractéristique | sora-2 | sora-2-pro |
|---|---|---|
| Qualité de génération | Bonne | Excellente |
| Vitesse de rendu | Rapide | Lente |
| Cas d'utilisation | Prototypage rapide, PoC | Sortie de niveau production |
| Prix | Standard | Élevé |
| Plateformes disponibles | APIYI (apiyi.com), API officielle | APIYI (apiyi.com), API officielle |
Exemple complet d'upload de fichier avec Sora 2
Voici un exemple complet utilisant curl pour appeler l'API Sora 2 afin de générer une vidéo à partir d'une image :
curl -X POST "https://api.apiyi.com/v1/videos" \
-H "Authorization: Bearer $APIYI_KEY" \
-H "Content-Type: multipart/form-data" \
-F prompt="She turns around and smiles, then slowly walks out of the frame." \
-F model="sora-2-pro" \
-F size="1280x720" \
-F seconds="8" \
-F input_reference="@sample_720p.jpeg;type=image/jpeg"
Analyse de la commande
| Partie | Description |
|---|---|
curl -X POST |
Spécifie la méthode de requête POST |
"https://api.apiyi.com/v1/videos" |
Point de terminaison (endpoint) Sora 2 sur APIYI |
-H "Authorization: Bearer $APIYI_KEY" |
Utilise une variable d'environnement pour la clé API |
-H "Content-Type: multipart/form-data" |
Déclare le type de contenu (ajouté automatiquement par curl -F) |
-F prompt="..." |
Invite (prompt) de description de la vidéo |
-F model="sora-2-pro" |
Sélectionne le modèle de haute qualité |
-F size="1280x720" |
Résolution paysage 720p |
-F seconds="8" |
Durée de 8 secondes |
-F input_reference="@sample_720p.jpeg;type=image/jpeg" |
Télécharge l'image de référence |
🚀 Démarrage rapide : Il est recommandé d'utiliser la plateforme APIYI (apiyi.com) pour tester rapidement l'API Sora 2. Elle propose des interfaces prêtes à l'emploi, permettant une intégration sans configuration complexe.
Points d'attention pour l'upload d'images
Lors de l'upload d'images de référence via l'API Sora 2, gardez en tête les points suivants :
| Exigence | Description |
|---|---|
| Correspondance de résolution | La résolution de l'image doit correspondre au paramètre size de la vidéo cible. |
| Formats supportés | image/jpeg, image/png, image/webp. |
| Taille du fichier | Il est conseillé de ne pas dépasser 10 Mo. |
| Qualité de l'image | Des images nettes avec une bonne composition donnent de meilleurs résultats. |
Implémentation de l'upload multipart/form-data en Python
En dehors de curl, on utilise plus souvent des langages de programmation pour implémenter l'upload de fichiers dans le développement réel. Voici comment faire avec Python.
Exemple minimaliste
import requests
# Utilisation de l'interface unifiée APIYI
url = "https://api.apiyi.com/v1/videos"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
# Préparation des données multipart
files = {
"input_reference": ("sample.jpeg", open("sample_720p.jpeg", "rb"), "image/jpeg")
}
data = {
"prompt": "She turns around and smiles, then slowly walks out of the frame.",
"model": "sora-2-pro",
"size": "1280x720",
"seconds": "8"
}
response = requests.post(url, headers=headers, data=data, files=files)
print(response.json())
Voir le code complet (avec gestion des erreurs et polling)
import requests
import time
import os
class Sora2Client:
"""Client API Sora 2 - supporte l'upload de fichiers multipart/form-data"""
def __init__(self, api_key: str, base_url: str = "https://api.apiyi.com/v1"):
self.api_key = api_key
self.base_url = base_url
self.headers = {"Authorization": f"Bearer {api_key}"}
def create_video(
self,
prompt: str,
model: str = "sora-2",
size: str = "1280x720",
seconds: int = 8,
input_reference: str = None
) -> dict:
"""
Créer une tâche de génération de vidéo
Args:
prompt: Description de la vidéo (invite)
model: Choix du modèle (sora-2 ou sora-2-pro)
size: Résolution
seconds: Durée (4, 8, 12)
input_reference: Chemin de l'image de référence (optionnel)
Returns:
Dictionnaire d'informations sur la tâche
"""
url = f"{self.base_url}/videos"
data = {
"prompt": prompt,
"model": model,
"size": size,
"seconds": str(seconds)
}
files = None
if input_reference and os.path.exists(input_reference):
# Déterminer le type MIME en fonction de l'extension du fichier
ext = os.path.splitext(input_reference)[1].lower()
mime_types = {
".jpg": "image/jpeg",
".jpeg": "image/jpeg",
".png": "image/png",
".webp": "image/webp"
}
mime_type = mime_types.get(ext, "application/octet-stream")
files = {
"input_reference": (
os.path.basename(input_reference),
open(input_reference, "rb"),
mime_type
)
}
try:
response = requests.post(
url,
headers=self.headers,
data=data,
files=files,
timeout=30
)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
return {"error": str(e)}
finally:
if files and "input_reference" in files:
files["input_reference"][1].close()
def get_video_status(self, video_id: str) -> dict:
"""Consulter le statut de génération de la vidéo"""
url = f"{self.base_url}/videos/{video_id}"
response = requests.get(url, headers=self.headers, timeout=30)
return response.json()
def wait_for_completion(self, video_id: str, poll_interval: int = 10) -> dict:
"""Attendre la fin de la génération par polling (interrogation périodique)"""
while True:
status = self.get_video_status(video_id)
if status.get("status") in ["completed", "failed"]:
return status
print(f"Statut : {status.get('status')}... attente {poll_interval}s")
time.sleep(poll_interval)
# Exemple d'utilisation
if __name__ == "__main__":
client = Sora2Client(api_key=os.getenv("APIYI_KEY"))
# Créer une tâche image-vers-vidéo
result = client.create_video(
prompt="She turns around and smiles, then slowly walks out of the frame.",
model="sora-2-pro",
size="1280x720",
seconds=8,
input_reference="sample_720p.jpeg"
)
if "id" in result:
print(f"Tâche créée : {result['id']}")
final_result = client.wait_for_completion(result["id"])
print(f"URL de la vidéo : {final_result.get('video_url')}")
else:
print(f"Erreur : {result}")
Conseil : Obtenez des crédits de test gratuits sur APIYI (apiyi.com) pour tester rapidement la fonctionnalité image-vers-vidéo.
Gestion du multipart avec la bibliothèque requests
Points clés de la gestion du multipart/form-data avec la bibliothèque Python requests :
| Paramètre | Usage | Description |
|---|---|---|
data |
Champs de formulaire classiques | Format dictionnaire : {"key": "value"} |
files |
Champs de fichiers | Format tuple : {"name": (filename, file_obj, content_type)} |
⚠️ Attention : En utilisant simultanément les paramètres
dataetfiles, requests définit automatiquement le bonContent-Typeet le boundary (délimiteur), inutile de les spécifier manuellement.
Solutions d'implémentation JavaScript/Node.js
Environnement navigateur (API FormData)
const formData = new FormData();
formData.append('prompt', 'She turns around and smiles');
formData.append('model', 'sora-2-pro');
formData.append('size', '1280x720');
formData.append('seconds', '8');
formData.append('input_reference', fileInput.files[0]);
fetch('https://api.apiyi.com/v1/videos', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY'
// Note : Ne définissez pas le Content-Type manuellement
},
body: formData
})
.then(response => response.json())
.then(data => console.log(data));
Environnement Node.js
const FormData = require('form-data');
const fs = require('fs');
const axios = require('axios');
const form = new FormData();
form.append('prompt', 'She turns around and smiles');
form.append('model', 'sora-2-pro');
form.append('size', '1280x720');
form.append('seconds', '8');
form.append('input_reference', fs.createReadStream('sample_720p.jpeg'), {
contentType: 'image/jpeg'
});
axios.post('https://api.apiyi.com/v1/videos', form, {
headers: {
...form.getHeaders(),
'Authorization': 'Bearer YOUR_API_KEY'
}
})
.then(response => console.log(response.data));
💡 Conseil clé : Lors de l'utilisation de
FormDatadans le navigateur, ne définissez pas l'en-têteContent-Typemanuellement. Le navigateur ajoutera automatiquement le bon paramètre boundary.
Dépannage des problèmes courants liés à multipart/form-data
Causes courantes d'échec de chargement
| Problème | Symptôme | Solution |
|---|---|---|
| Limite (boundary) manquante | Le serveur renvoie une erreur 400 | Ne définissez pas manuellement le Content-Type, laissez l'outil le générer automatiquement |
| Type MIME incorrect | Fichier refusé | Utilisez ;type=image/jpeg pour spécifier explicitement le type |
| Chemin de fichier incorrect | Fichier introuvable | Assurez-vous que le chemin après le @ est correct ; les chemins relatifs et absolus sont supportés |
| Incohérence de résolution | Erreur de l'API Sora | La résolution de l'image doit correspondre au paramètre size |
| Fichier trop volumineux | Délai d'attente dépassé ou refusé | Compressez l'image ou utilisez le chargement par morceaux (multipart upload) |
Astuces de débogage
Utilisez l'option -v de curl pour visualiser la requête complète :
curl -v -F "[email protected]" https://api.example.com/upload
Cela affichera :
- Les en-têtes de requête (incluant le Content-Type et le boundary générés automatiquement)
- La structure du corps de la requête
- La réponse du serveur
Questions fréquemment posées (FAQ)
Q1 : multipart/form-data ou encodage Base64, lequel est le meilleur ?
multipart/form-data est préférable pour le chargement de fichiers. L'encodage Base64 augmente la taille du fichier d'environ 33 %, ce qui accroît le temps de transfert réseau et la charge de traitement du serveur. multipart/form-data transmet directement les données binaires, ce qui est bien plus efficace.
Cependant, dans certains scénarios spécifiques (comme les WebSockets ou les API JSON à champ unique), le Base64 peut être la seule option. Lors de l'appel d'API via la plateforme APIYI (apiyi.com), privilégiez l'utilisation de multipart/form-data pour bénéficier de meilleures performances.
Q2 : Pourquoi mon chargement avec curl -F échoue-t-il ?
Les causes courantes incluent :
- Problème de chemin de fichier : Assurez-vous que le symbole
@est immédiatement suivi du bon chemin vers le fichier. - Problème de permissions : Vérifiez que vous avez les droits de lecture sur le fichier.
- Type MIME : Certaines API exigent que vous spécifiiez un content-type correct.
Nous vous recommandons d'utiliser d'abord l'environnement de test d'APIYI (apiyi.com) pour valider le format de votre requête. La plateforme fournit des messages d'erreur détaillés pour vous aider à localiser rapidement le problème.
Q3 : Quels formats d’image sont supportés par l’API Sora 2 ?
L'API Sora 2 supporte les formats d'image suivants pour le paramètre input_reference :
- JPEG (
.jpg,.jpeg) – Recommandé pour son bon taux de compression. - PNG (
.png) – Idéal si vous avez besoin de gérer la transparence. - WebP (
.webp) – Format moderne offrant une taille de fichier réduite.
Notez que la résolution de l'image doit correspondre exactement au paramètre size de la vidéo cible. Par exemple, si vous demandez une résolution de 1280x720, votre image de référence doit également être en 1280×720.
Q4 : Comment gérer le chargement de fichiers volumineux ?
Pour les fichiers de grande taille, vous pouvez envisager les approches suivantes :
- Chargement par morceaux (Chunked upload) : Divisez le fichier en plusieurs petits blocs envoyés successivement.
- Optimisation par compression : Compressez le fichier autant que possible tout en préservant la qualité nécessaire.
- Reprise du téléchargement (Resumable upload) : Implémentez un mécanisme permettant de reprendre le chargement là où il s'est arrêté en cas d'interruption.
Le format multipart/form-data supporte nativement le streaming (transmission en flux), ce qui permet au serveur de traiter les données au fur et à mesure de leur réception, une méthode parfaitement adaptée aux fichiers volumineux.
Résumé
Cet article a présenté en détail la technologie au cœur du téléchargement de fichiers via API : multipart/form-data.
Récapitulatif des points clés :
| Point | Explication |
|---|---|
| Principe d'encodage | Utilisation d'un boundary (délimiteur) pour séparer les données multi-parties, chaque partie possédant son propre Content-Type. |
| Commande curl -F | -F "clé=valeur" pour envoyer du texte, -F "clé=@fichier" pour télécharger un fichier. |
| Cas pratique Sora 2 | Utilisation du paramètre input_reference pour envoyer des images de référence (la résolution doit correspondre). |
| Implémentations | Utilisation de Python requests ou de FormData en JavaScript. |
| Astuces de débogage | Utiliser curl -v pour visualiser l'intégralité de la requête HTTP. |
Maîtriser le multipart/form-data est une compétence fondamentale pour le développement d'API d'IA. Qu'il s'agisse de la génération vidéo avec Sora 2, de la compréhension d'images avec GPT-4 Vision ou de toute autre API nécessitant l'envoi de fichiers, les principes fondamentaux restent les mêmes.
Nous vous recommandons d'utiliser APIYI (apiyi.com) pour tester rapidement vos fonctionnalités de téléchargement de fichiers et profiter d'une interface API unifiée ainsi que d'un support technique complet.
Auteur : Équipe APIYI | Experts en partage de technologies d'API pour grands modèles de langage
Échanges techniques : Visitez apiyi.com pour accéder à davantage de ressources de développement d'API.
Références
-
RFC 2388 : Spécification standard multipart/form-data
- Lien :
tools.ietf.org/html/rfc2388
- Lien :
-
Documentation officielle curl : Multipart Formposts
- Lien :
everything.curl.dev/http/post/multipart
- Lien :
-
MDN Web Docs : Utilisation des objets FormData
- Lien :
developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest_API/Using_FormData_Objects
- Lien :
-
Documentation API OpenAI Sora : Guide de génération vidéo
- Lien :
platform.openai.com/docs/guides/video-generation
- Lien :
