Das Hochladen von Dateien über APIs ist eine häufige technische Anforderung für Entwickler, die Schnittstellen für KI-Videogenerierung, Bildverarbeitung und Ähnliches nutzen. In diesem Artikel erklären wir systematisch die Funktionsweise der multipart/form-data Kodierung und zeigen Ihnen am Beispiel der Sora 2 Image-to-Video API, wie Sie die Kernkompetenz des API-Datei-Uploads meistern.
Kernwert: Nach der Lektüre dieses Artikels werden Sie die zugrunde liegenden Mechanismen von multipart/form-data vollständig verstehen, den Umgang mit dem Befehl curl -F zum Hochladen von Dateien beherrschen und in der Lage sein, die Bild-Upload-Funktion für KI-APIs wie Sora 2 eigenständig zu implementieren.

Kernwissen zum API-Datei-Upload
Bevor wir uns dem Code widmen, müssen wir verstehen, warum der API-Datei-Upload eine spezielle Kodierungsmethode erfordert.
Warum multipart/form-data benötigt wird
Wenn Sie gewöhnliche Textdaten über eine API senden, können Sie die einfache application/x-www-form-urlencoded Kodierung verwenden. Bei der Verarbeitung von Dateien stößt diese Methode jedoch an ihre Grenzen:
| Kodierungstyp | Anwendungsfall | Dateiverarbeitung | Effizienz |
|---|---|---|---|
application/x-www-form-urlencoded |
Einfache Key-Value-Paare | ❌ Nicht geeignet | Binärdaten erfordern URL-Escaping, geringe Effizienz |
application/json |
Strukturierte Daten | ⚠️ Base64 nötig | Volumen steigt um 33% |
multipart/form-data |
Datei-Upload | ✅ Native Unterstützung | Keine Kodierung nötig, hocheffizient |
multipart/form-data ist eine 1998 im Standard RFC 2388 vorgeschlagene Lösung, um das Problem des gemischten Sendens von Text- und Binärdaten im HTTP-Protokoll gezielt zu lösen.
Funktionsweise von multipart/form-data
Die Kernidee von multipart/form-data besteht darin, einen HTTP-Anfrage-Body in mehrere unabhängige „Teile“ (Parts) zu unterteilen, wobei jeder Teil seinen eigenen Content-Type haben kann.

Detaillierte Datenstruktur
Eine typische multipart/form-data Anfrage weist folgende Struktur auf:
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
[Binäre Bilddaten]
------WebKitFormBoundary7MA4YWxk--
| Komponente | Funktion | Beispiel |
|---|---|---|
| Boundary | Eindeutiger Identifikator zur Trennung der Datenteile | ----WebKitFormBoundary7MA4YWxk |
| Content-Disposition | Metadaten, die diesen Teil beschreiben | form-data; name="prompt" |
| Content-Type | MIME-Typ dieses Teils | image/jpeg |
| Body | Eigentlicher Dateninhalt | Text oder Binärdaten |
🎯 Technischer Hinweis: Die Boundary muss ein eindeutiger String sein, der nicht im eigentlichen Inhalt der Anfrage vorkommt. Der Server nutzt diese Boundary, um die einzelnen Datenabschnitte zu parsen und voneinander zu trennen.
Detaillierte Erläuterung des curl -F Befehls: API-Datei-Upload in der Praxis
curl ist das am häufigsten verwendete Kommandozeilen-Tool für HTTP-Clients. Sein Parameter -F ist speziell für multipart/form-data Anfragen konzipiert.
curl -F Basissyntax
curl -F "Feldname=Wert" URL
curl -F "Dateifeld=@LokalerDateipfad" URL
| Parameter-Format | Beschreibung | Beispiel |
|---|---|---|
-F "key=value" |
Sendet ein normales Textfeld | -F "prompt=Hallo" |
-F "key=@file" |
Lädt eine lokale Datei hoch | -F "[email protected]" |
-F "key=@file;type=mime" |
Spezifiziert den MIME-Typ der Datei | -F "[email protected];type=image/jpeg" |
-F "key=@file;filename=neu.jpg" |
Benutzerdefinierter Dateiname beim Upload | -F "[email protected];filename=upload.jpg" |
Unterschied zwischen curl -F und anderen Parametern
Viele Entwickler verwechseln leicht die Verwendung von -F, -d und -X POST:
# ❌ Falsch: -d wird für x-www-form-urlencoded verwendet und ist nicht für Datei-Uploads geeignet
curl -X POST -d "[email protected]" https://api.example.com/upload
# ❌ Falsch: Content-Type manuell angeben, aber -d verwenden
curl -X POST -H "Content-Type: multipart/form-data" -d "..." https://api.example.com/upload
# ✅ Richtig: -F verwenden, um automatisch den korrekten Content-Type und die Boundary zu setzen
curl -F "[email protected]" https://api.example.com/upload
Technischer Hinweis: Bei Verwendung von
-Fführt curl automatisch folgende Schritte aus:
- Die Anfragemethode wird auf POST gesetzt.
Content-Type: multipart/form-datawird gesetzt.- Eine eindeutige Boundary wird generiert.
- Der Body der Anfrage wird gemäß RFC-Standards formatiert.
Sora 2 API Datei-Upload in der Praxis
Sora 2 ist das von OpenAI vorgestellte Videogenerierungsmodell, das den Upload von Referenzbildern via API unterstützt, um daraus Videos zu generieren. Dies ist ein typisches Anwendungsszenario für multipart/form-data.
Sora 2 Bild-zu-Video API-Parameter
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
prompt |
String | ✅ | Eingabeaufforderung (Prompt) zur Videobeschreibung |
model |
String | ❌ | Modellauswahl: sora-2 oder sora-2-pro |
size |
String | ❌ | Auflösung: 1280x720, 720x1280, 1024x1792, 1792x1024 |
seconds |
Integer | ❌ | Dauer: 4, 8, 12 Sekunden |
input_reference |
Datei | ❌ | Referenzbild, dient als erster Frame des Videos |

Sora 2 Modellvergleich
| Merkmal | sora-2 | sora-2-pro |
|---|---|---|
| Qualität | Gut | Exzellent |
| Rendering-Speed | Schneller | Langsamer |
| Anwendungsbereich | Schnelles Prototyping, PoC | Produktionsreifer Output |
| Preis | Standard | Höher |
| Plattformen | APIYI apiyi.com, Offizielle API | APIYI apiyi.com, Offizielle API |
Vollständiges Beispiel für den Sora 2 Datei-Upload
Hier ist ein komplettes Beispiel, wie Sie mit curl die Sora 2 API für die Bild-zu-Video-Generierung aufrufen:
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"
Befehlsanalyse
| Teil | Beschreibung |
|---|---|
curl -X POST |
Spezifiziert die POST-Anfragemethode |
"https://api.apiyi.com/v1/videos" |
APIYI Sora 2 Video-Generierungsendpunkt |
-H "Authorization: Bearer $APIYI_KEY" |
Verwendet eine Umgebungsvariable für den API-Key |
-H "Content-Type: multipart/form-data" |
Deklariert den Content-Type (wird durch curl -F automatisch ergänzt) |
-F prompt="..." |
Eingabeaufforderung (Prompt) der Videobeschreibung |
-F model="sora-2-pro" |
Auswahl des hochwertigen Modells |
-F size="1280x720" |
Querformat 720p Auflösung |
-F seconds="8" |
8 Sekunden Dauer |
-F input_reference="..." |
Lädt das Referenzbild hoch |
🚀 Schnellstart: Es wird empfohlen, die Plattform APIYI apiyi.com für schnelle Tests der Sora 2 API zu nutzen. Die Plattform bietet sofort einsatzbereite Schnittstellen, mit denen die Integration ohne komplexe Konfiguration gelingt.
Wichtige Hinweise zum Bilder-Upload
Beim Hochladen von Referenzbildern für die Sora 2 API sollten Sie folgendes beachten:
| Anforderung | Erläuterung |
|---|---|
| Auflösung | Die Bildauflösung muss mit dem gewählten size-Parameter des Videos übereinstimmen. |
| Formate | Unterstützt werden image/jpeg, image/png, image/webp. |
| Dateigröße | Empfohlen werden maximal 10 MB. |
| Bildqualität | Klare Bilder mit gut durchdachter Komposition erzielen deutlich bessere Ergebnisse. |
Python-Implementierung von multipart/form-data Uploads
Neben curl werden in der Praxis meist Programmiersprachen verwendet, um Dateiuploads zu realisieren. Hier ist die Umsetzung in Python.
Minimalbeispiel
import requests
# Nutzung der einheitlichen Schnittstelle von APIYI
url = "https://api.apiyi.com/v1/videos"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
# Vorbereitung der Multipart-Daten
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())
Vollständigen Code anzeigen (inkl. Fehlerbehandlung und Polling)
import requests
import time
import os
class Sora2Client:
"""Sora 2 API Client - Unterstützt multipart/form-data Dateiuploads"""
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:
"""
Erstellt einen Video-Generierungs-Task
Args:
prompt: Videobeschreibung (Eingabeaufforderung)
model: Modellauswahl (sora-2 oder sora-2-pro)
size: Auflösung
seconds: Dauer (4, 8, 12)
input_reference: Pfad zum Referenzbild (optional)
Returns:
Dictionary mit Task-Informationen
"""
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):
# MIME-Typ basierend auf der Dateiendung bestimmen
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:
"""Abfrage des Status der Videogenerierung"""
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:
"""Polling, bis die Videogenerierung abgeschlossen ist"""
while True:
status = self.get_video_status(video_id)
if status.get("status") in ["completed", "failed"]:
return status
print(f"Status: {status.get('status')}... warte {poll_interval}s")
time.sleep(poll_interval)
# Anwendungsbeispiel
if __name__ == "__main__":
client = Sora2Client(api_key=os.getenv("APIYI_KEY"))
# Erstellt einen Bild-zu-Video-Task
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"Task erstellt: {result['id']}")
final_result = client.wait_for_completion(result["id"])
print(f"Video-URL: {final_result.get('video_url')}")
else:
print(f"Fehler: {result}")
Tipp: Holen Sie sich kostenloses Testguthaben über APIYI (apiyi.com), um die Bild-zu-Video-Funktion schnell zu testen.
Multipart-Verarbeitung mit der requests-Bibliothek
Wichtige Punkte bei der Verarbeitung von multipart/form-data mit der Python requests-Bibliothek:
| Parameter | Zweck | Beschreibung |
|---|---|---|
data |
Normale Formularfelder | Wörterbuch-Format: {"key": "value"} |
files |
Dateifelder | Tupel-Format: {"name": (filename, file_obj, content_type)} |
⚠️ Achtung: Wenn die Parameter
dataundfilesgleichzeitig verwendet werden, setzt requests automatisch den korrektenContent-Typeund Boundary. Dies muss nicht manuell angegeben werden.
Implementierungslösungen für JavaScript/Node.js
Browser-Umgebung (FormData API)
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'
// Hinweis: Content-Type nicht manuell setzen
},
body: formData
})
.then(response => response.json())
.then(data => console.log(data));
Node.js-Umgebung
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));
💡 Wichtiger Hinweis: Wenn Sie
FormDataim Browser verwenden, setzen Sie denContent-Type-Header NICHT manuell. Der Browser fügt den korrektenboundary-Parameter automatisch hinzu.
Fehlerbehebung für multipart/form-data
Häufige Gründe für fehlgeschlagene Uploads
| Problem | Symptom | Lösung |
|---|---|---|
| Fehlende Boundary | Server gibt 400 zurück | Setzen Sie den Content-Type nicht manuell; lassen Sie das Tool ihn automatisch generieren |
| Falscher MIME-Typ | Datei wird abgelehnt | Verwenden Sie ;type=image/jpeg, um den Typ explizit anzugeben |
| Falscher Dateipfad | Datei nicht gefunden | Stellen Sie sicher, dass der Pfad nach dem @-Zeichen korrekt ist; unterstützt relative und absolute Pfade |
| Auflösung stimmt nicht überein | Sora-API gibt Fehler aus | Die Bildauflösung muss exakt mit dem Parameter size übereinstimmen |
| Datei zu groß | Timeout oder Ablehnung | Bild komprimieren oder Chunked Upload (segmentiertes Hochladen) verwenden |
Debugging-Tipps
Verwenden Sie den Parameter -v von curl, um die vollständige Anfrage einzusehen:
curl -v -F "[email protected]" https://api.example.com/upload
Dies zeigt Ihnen:
- Die Request-Header (einschließlich des automatisch generierten Content-Type und der Boundary)
- Die Struktur des Request-Bodys
- Die Antwort des Servers
Häufig gestellte Fragen
Q1: Was ist besser: multipart/form-data oder Base64-Kodierung?
multipart/form-data ist für Datei-Uploads besser geeignet. Eine Base64-Kodierung erhöht die Dateigröße um etwa 33 %, was sowohl die Übertragungszeit im Netzwerk als auch die Verarbeitungslast auf dem Server steigert. multipart/form-data überträgt Binärdaten direkt und ist daher deutlich effizienter.
In bestimmten Szenarien (wie WebSockets oder rein feldgesteuerten JSON-APIs) kann Base64 jedoch die einzige Option sein. Wenn Sie APIs über die Plattform APIYI (apiyi.com) aufrufen, sollten Sie jedoch bevorzugt multipart/form-data nutzen, um eine bessere Performance zu erzielen.
Q2: Warum schlägt mein Upload mit curl -F fehl?
Häufige Ursachen sind:
- Pfadprobleme: Stellen Sie sicher, dass nach dem
@-Symbol der korrekte Dateipfad folgt. - Berechtigungsprobleme: Überprüfen Sie, ob die Datei Leserechte besitzt.
- MIME-Typ: Einige APIs setzen voraus, dass der Content-Type explizit korrekt angegeben wird.
Es empfiehlt sich, zunächst über APIYI (apiyi.com) eine Testumgebung aufzurufen, um das Format der Anfrage zu validieren. Die Plattform bietet detaillierte Fehlermeldungen, die bei der schnellen Lokalisierung des Problems helfen.
Q3: Welche Bildformate unterstützt die Sora 2 API?
Die Sora 2 API unterstützt die folgenden Formate für input_reference:
- JPEG (
.jpg,.jpeg) – Empfohlen, gute Kompressionsrate. - PNG (
.png) – Unterstützt Transparenzkanäle. - WebP (
.webp) – Modernes Format mit geringer Dateigröße.
Die Bildauflösung muss zwingend mit dem size-Parameter des Zielvideos übereinstimmen. Wenn Sie beispielsweise eine Auflösung von 1280x720 wählen, muss auch das Referenzbild exakt 1280×720 Pixel groß sein.
Q4: Wie gehe ich mit dem Upload großer Dateien um?
Für den Upload großer Dateien gibt es folgende Ansätze:
- Chunked Upload: Die Datei wird in kleine Stücke zerlegt und nacheinander hochgeladen.
- Kompressionsoptimierung: Komprimieren Sie die Datei, solange die Qualität für den Anwendungsfall akzeptabel bleibt.
- Resumable Uploads: Unterstützung für das Fortsetzen des Uploads an der Abbruchstelle im Falle eines Fehlers.
Da multipart/form-data Streaming unterstützt, kann der Server die Daten bereits während des Empfangs verarbeiten, was es ideal für Szenarien mit großen Dateien macht.
Zusammenfassung
In diesem Artikel haben wir die Kerntechnologie für API-Datei-Uploads, multipart/form-data, im Detail vorgestellt:
Zusammenfassung der wichtigsten Punkte:
| Aspekt | Beschreibung |
|---|---|
| Kodierungsprinzip | Boundary trennt mehrteilige Daten, jeder Teil hat einen eigenen Content-Type. |
| curl -F Befehl | -F "key=value" sendet Text, -F "key=@file" lädt Dateien hoch. |
| Sora 2 Praxisbeispiel | Parameter input_reference zum Hochladen von Referenzbildern, Auflösung muss übereinstimmen. |
| Implementierung | Python requests / JavaScript FormData. |
| Debugging-Tipps | Verwenden Sie curl -v, um die vollständige Anfrage einzusehen. |
Die Beherrschung von multipart/form-data ist eine grundlegende Fähigkeit für die Entwicklung von KI-APIs. Ob bei der Videogenerierung mit Sora 2, dem Bildverständnis von GPT-4 Vision oder anderen APIs, die einen Datei-Upload erfordern – die Kernprinzipien sind dieselben.
Wir empfehlen, die Datei-Upload-Funktion über APIYI (apiyi.com) schnell zu validieren und von einer einheitlichen API-Schnittstelle sowie umfassendem technischem Support zu profitieren.
Autor: APIYI Team | Fokus auf technischem Austausch zu Großes Sprachmodell APIs
Technischer Austausch: Besuchen Sie apiyi.com für weitere Ressourcen zur API-Entwicklung.
Referenzen
-
RFC 2388: Standard-Spezifikation für multipart/form-data
- Link:
tools.ietf.org/html/rfc2388
- Link:
-
Offizielle curl-Dokumentation: Multipart Formposts
- Link:
everything.curl.dev/http/post/multipart
- Link:
-
MDN Web Docs: Verwendung von FormData-Objekten
- Link:
developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest_API/Using_FormData_Objects
- Link:
-
OpenAI Sora API Dokumentation: Video Generation Guide
- Link:
platform.openai.com/docs/guides/video-generation
- Link:
