Upload file API adalah kebutuhan teknis yang sering ditemui pengembang saat memanggil interface seperti pembuatan video AI, pemrosesan gambar, dan lain-lain. Artikel ini akan menjelaskan secara sistematis prinsip kerja metode pengodean multipart/form-data, dan menggunakan API Sora 2 Image-to-Video sebagai contoh untuk membantu Anda menguasai keterampilan inti unggah file API.
Nilai Inti: Setelah membaca artikel ini, Anda akan memahami sepenuhnya mekanisme dasar multipart/form-data, mempelajari cara menggunakan perintah curl -F untuk mengunggah file, dan mampu mengimplementasikan fitur unggah gambar untuk AI API seperti Sora 2 secara mandiri.

Pengetahuan Inti Unggah File API
Sebelum masuk ke kode, kita perlu memahami mengapa unggah file API memerlukan metode pengodean khusus.
Mengapa memerlukan multipart/form-data
Saat Anda mengirim data teks biasa melalui API, Anda dapat menggunakan pengodean sederhana application/x-www-form-urlencoded. Namun, metode ini memiliki masalah serius saat menangani file:
| Tipe Pengodean | Skenario Penggunaan | Kemampuan Pemrosesan File | Efisiensi |
|---|---|---|---|
application/x-www-form-urlencoded |
Pasangan kunci-nilai sederhana | ❌ Tidak cocok | Biner butuh escape URL, efisiensi rendah |
application/json |
Data terstruktur | ⚠️ Perlu pengodean Base64 | Volume bertambah 33% |
multipart/form-data |
Unggah file | ✅ Dukungan native | Tanpa pengodean, efisien |
multipart/form-data adalah solusi yang diusulkan dalam standar RFC 2388 pada tahun 1998, khusus untuk menyelesaikan masalah pengiriman campuran data teks dan biner dalam protokol HTTP.
Prinsip Kerja multipart/form-data
Ide utama dari multipart/form-data adalah membagi satu body permintaan HTTP menjadi beberapa "bagian" (parts) yang independen, di mana setiap bagian dapat memiliki tipe kontennya sendiri.

Detail Struktur Data
Permintaan multipart/form-data yang tipikal berisi struktur berikut:
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
[Data gambar biner]
------WebKitFormBoundary7MA4YWxk--
| Komponen | Fungsi | Contoh |
|---|---|---|
| Boundary | Pengidentifikasi unik untuk memisahkan setiap bagian data | ----WebKitFormBoundary7MA4YWxk |
| Content-Disposition | Metadata yang mendeskripsikan bagian tersebut | form-data; name="prompt" |
| Content-Type | Tipe MIME dari bagian tersebut | image/jpeg |
| Body | Konten data aktual | Data teks atau biner |
🎯 Poin Teknis: Boundary harus berupa string unik yang tidak akan muncul di dalam body permintaan. Server menggunakan boundary untuk mem-parse dan memisahkan setiap bagian data.
Penjelasan Lengkap Perintah curl -F: Praktik Upload File API
curl adalah alat klien HTTP baris perintah yang paling sering digunakan, dan parameter -F miliknya khusus digunakan untuk permintaan multipart/form-data.
Sintaks Dasar curl -F
curl -F "nama_field=nilai" URL
curl -F "field_file=@jalur_file_lokal" URL
| Bentuk Parameter | Penjelasan | Contoh |
|---|---|---|
-F "key=value" |
Mengirim kolom teks biasa | -F "prompt=Hello" |
-F "key=@file" |
Mengunggah file lokal | -F "[email protected]" |
-F "key=@file;type=mime" |
Menentukan tipe MIME file | -F "[email protected];type=image/jpeg" |
-F "key=@file;filename=new.jpg" |
Kustomisasi nama file yang diunggah | -F "[email protected];filename=upload.jpg" |
Perbedaan antara curl -F dengan Parameter Lainnya
Banyak pengembang sering bingung dalam menggunakan -F, -d, dan -X POST:
# ❌ Salah: -d digunakan untuk x-www-form-urlencoded, tidak cocok untuk upload file
curl -X POST -d "[email protected]" https://api.example.com/upload
# ❌ Salah: Menentukan Content-Type secara manual tetapi menggunakan -d
curl -X POST -H "Content-Type: multipart/form-data" -d "..." https://api.example.com/upload
# ✅ Benar: Menggunakan -F secara otomatis mengatur Content-Type dan boundary yang tepat
curl -F "[email protected]" https://api.example.com/upload
Penjelasan Teknis: Saat menggunakan
-F, curl akan secara otomatis:
- Mengatur metode permintaan menjadi POST
- Mengatur
Content-Type: multipart/form-data- Menghasilkan boundary yang unik
- Memformat badan permintaan (request body) sesuai standar RFC
Praktik Upload File API Sora 2
Sora 2 adalah model pembuatan video yang diluncurkan oleh OpenAI, yang mendukung pengunggahan gambar referensi melalui API untuk menghasilkan video. Ini adalah skenario aplikasi tipikal untuk multipart/form-data.
Parameter API Video dari Gambar Sora 2
| Parameter | Tipe | Wajib | Penjelasan |
|---|---|---|---|
prompt |
string | ✅ | Teks deskripsi video |
model |
string | ❌ | Pilihan model: sora-2 atau sora-2-pro |
size |
string | ❌ | Resolusi: 1280x720, 720x1280, 1024x1792, 1792x1024 |
seconds |
integer | ❌ | Durasi: 4, 8, 12 detik |
input_reference |
file | ❌ | Gambar referensi, sebagai frame pertama video |

Perbandingan Model Sora 2
| Fitur | sora-2 | sora-2-pro |
|---|---|---|
| Kualitas Generasi | Baik | Luar Biasa |
| Kecepatan Rendering | Cukup Cepat | Cukup Lambat |
| Skenario Penggunaan | Prototipe Cepat, Proof of Concept | Output Tingkat Produksi |
| Harga | Standar | Cukup Tinggi |
| Platform Tersedia | APIYI apiyi.com, API Resmi | APIYI apiyi.com, API Resmi |
Contoh Lengkap Upload File Sora 2
Berikut adalah contoh lengkap menggunakan curl untuk memanggil API Sora 2 guna melakukan pembuatan video dari gambar:
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"
Analisis Perintah
| Bagian | Penjelasan |
|---|---|
curl -X POST |
Menentukan metode permintaan POST |
"https://api.apiyi.com/v1/videos" |
Endpoint pembuatan video Sora 2 di APIYI |
-H "Authorization: Bearer $APIYI_KEY" |
Menggunakan variabel lingkungan untuk mengirimkan kunci API |
-H "Content-Type: multipart/form-data" |
Mendeklarasikan tipe konten (curl -F akan menambahkannya secara otomatis) |
-F prompt="..." |
Petunjuk deskripsi video |
-F model="sora-2-pro" |
Memilih model kualitas tinggi |
-F size="1280x720" |
Resolusi landscape 720p |
-F seconds="8" |
Durasi 8 detik |
-F input_reference="@sample_720p.jpeg;type=image/jpeg" |
Mengunggah gambar referensi |
🚀 Mulai Cepat: Direkomendasikan menggunakan platform APIYI apiyi.com untuk menguji API Sora 2 dengan cepat. Platform ini menyediakan antarmuka API siap pakai tanpa memerlukan konfigurasi rumit untuk menyelesaikan integrasi.
Hal yang Perlu Diperhatikan Saat Upload Gambar
Saat menggunakan API Sora 2 untuk mengunggah gambar referensi, perhatikan hal berikut:
| Persyaratan | Penjelasan |
|---|---|
| Kesesuaian Resolusi | Resolusi gambar harus sesuai dengan parameter size video tujuan |
| Format yang Didukung | image/jpeg, image/png, image/webp |
| Ukuran File | Disarankan tidak melebihi 10MB |
| Kualitas Gambar | Gambar yang jelas dengan komposisi lengkap akan memberikan hasil yang lebih baik |
Implementasi Python untuk Unggah multipart/form-data
Selain curl, dalam pengembangan nyata kita lebih sering menggunakan bahasa pemrograman untuk melakukan unggah berkas. Berikut adalah cara implementasinya menggunakan Python.
Contoh Sangat Sederhana
import requests
# Menggunakan antarmuka terpadu APIYI
url = "https://api.apiyi.com/v1/videos"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
# Menyiapkan data 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())
Lihat kode lengkap (termasuk penanganan kesalahan dan polling)
import requests
import time
import os
class Sora2Client:
"""Klien API Sora 2 - Mendukung unggahan berkas 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:
"""
Membuat tugas pembuatan video
Args:
prompt: Deskripsi video (petunjuk)
model: Pilihan model (sora-2 atau sora-2-pro)
size: Resolusi
seconds: Durasi (4, 8, 12)
input_reference: Jalur gambar referensi (opsional)
Returns:
Kamus informasi tugas
"""
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):
# Menentukan tipe MIME berdasarkan ekstensi berkas
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:
"""Memeriksa status pembuatan video"""
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 untuk menunggu pembuatan video selesai"""
while True:
status = self.get_video_status(video_id)
if status.get("status") in ["completed", "failed"]:
return status
print(f"Status: {status.get('status')}... menunggu {poll_interval} detik")
time.sleep(poll_interval)
# Contoh penggunaan
if __name__ == "__main__":
client = Sora2Client(api_key=os.getenv("APIYI_KEY"))
# Membuat tugas Image-to-Video
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"Tugas berhasil dibuat: {result['id']}")
final_result = client.wait_for_completion(result["id"])
print(f"Video URL: {final_result.get('video_url')}")
else:
print(f"Terjadi kesalahan: {result}")
Saran: Dapatkan kuota pengujian gratis melalui APIYI apiyi.com untuk memvalidasi fitur Image-to-Video dengan cepat.
Penanganan multipart pada pustaka requests
Poin penting dalam menangani multipart/form-data dengan pustaka requests Python:
| Parameter | Kegunaan | Penjelasan |
|---|---|---|
data |
Field formulir biasa | Format kamus (dictionary): {"key": "value"} |
files |
Field berkas | Format tuple: {"name": (filename, file_obj, content_type)} |
⚠️ Catatan: Saat menggunakan parameter
datadanfilessecara bersamaan, requests akan secara otomatis mengaturContent-Typedan boundary yang benar, jadi Anda tidak perlu menentukannya secara manual.
Solusi Implementasi JavaScript/Node.js
Lingkungan Browser (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'
// Catatan: Jangan mengatur Content-Type secara manual
},
body: formData
})
.then(response => response.json())
.then(data => console.log(data));
Lingkungan 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));
💡 Tip Penting: Saat menggunakan
FormDatadi browser, jangan mengatur headerContent-Typesecara manual. Browser akan menambahkan parameter boundary yang benar secara otomatis.
Pemecahan Masalah Umum multipart/form-data
Penyebab Umum Gagal Unggah
| Masalah | Gejala | Solusi |
|---|---|---|
| Boundary hilang | Server mengembalikan 400 | Jangan atur Content-Type secara manual, biarkan alat pembuatnya secara otomatis |
| Kesalahan tipe MIME | File ditolak | Gunakan ;type=image/jpeg untuk menentukan secara eksplisit |
| Kesalahan jalur file | File tidak ditemukan | Pastikan jalur setelah @ benar, mendukung jalur relatif/absolut |
| Resolusi tidak cocok | Sora API error | Resolusi gambar harus sesuai dengan parameter size |
| File terlalu besar | Timeout atau ditolak | Kompres gambar atau unggah dalam bentuk potongan (chunk) |
Tips Debugging
Gunakan parameter -v pada curl untuk melihat detail permintaan lengkap:
curl -v -F "[email protected]" https://api.example.com/upload
Ini akan menampilkan:
- Header permintaan (termasuk Content-Type dan boundary yang dibuat otomatis)
- Struktur isi permintaan (request body)
- Respons server
Pertanyaan Umum (FAQ)
Q1: Mana yang lebih baik antara multipart/form-data dan pengodean Base64?
multipart/form-data lebih cocok untuk unggah file. Pengodean Base64 akan meningkatkan ukuran file sekitar 33%, yang menambah waktu transmisi jaringan dan beban pemrosesan server. multipart/form-data mengirimkan data biner secara langsung, sehingga jauh lebih efisien.
Namun, dalam skenario tertentu (seperti WebSocket atau API JSON kolom tunggal), Base64 mungkin menjadi satu-satunya pilihan. Saat memanggil API melalui platform APIYI apiyi.com, prioritaskan penggunaan metode multipart/form-data untuk mendapatkan performa yang lebih baik.
Q2: Mengapa unggahan curl -F saya gagal?
Penyebab umumnya meliputi:
- Masalah jalur file: Pastikan simbol
@diikuti dengan jalur file yang benar. - Masalah izin: Periksa izin baca file tersebut.
- Tipe MIME: Beberapa API mengharuskan penentuan content-type yang tepat.
Disarankan untuk melakukan verifikasi format permintaan melalui lingkungan pengujian di APIYI apiyi.com terlebih dahulu. Platform ini menyediakan informasi kesalahan yang detail untuk membantu Anda menemukan masalah dengan cepat.
Q3: Format gambar apa saja yang didukung oleh Sora 2 API?
Sora 2 API mendukung format gambar berikut untuk input_reference:
- JPEG (
.jpg,.jpeg) – Direkomendasikan, tingkat kompresi baik. - PNG (
.png) – Mendukung saluran transparansi (alpha channel). - WebP (
.webp) – Format modern dengan ukuran file kecil.
Resolusi gambar harus sesuai dengan parameter size dari video target. Misalnya, jika menggunakan resolusi 1280x720, maka gambar referensi juga harus berukuran 1280×720.
Q4: Bagaimana cara menangani unggahan file berukuran besar?
Untuk unggahan file besar, Anda bisa mempertimbangkan:
- Unggahan Terfragmentasi (Chunked Upload): Membagi file menjadi bagian-bagian kecil dan mengunggahnya secara berurutan.
- Optimasi Kompresi: Mengompres file selama kualitasnya masih terjaga.
- Resume Upload: Mendukung kelanjutan unggahan dari titik terakhir jika terjadi kegagalan.
multipart/form-data mendukung transmisi streaming, di mana server dapat menerima data sambil memprosesnya, sehingga sangat cocok untuk skenario file besar.
Ringkasan
Artikel ini menjelaskan secara rinci teknologi inti untuk unggah file API, yaitu multipart/form-data:
Tinjauan Poin Penting:
| Poin Penting | Penjelasan |
|---|---|
| Prinsip Pengodean | Boundary memisahkan data multipart, setiap bagian memiliki Content-Type sendiri |
| Perintah curl -F | -F "key=value" mengirim teks, -F "key=@file" mengunggah file |
| Praktik Sora 2 | Parameter input_reference mengunggah gambar referensi, resolusi harus sesuai |
| Implementasi Multibahasa | Python requests / JavaScript FormData |
| Tips Debugging | Gunakan curl -v untuk melihat permintaan lengkap |
Menguasai multipart/form-data adalah kemampuan dasar dalam pengembangan API AI. Baik itu pembuatan video Sora 2, pemahaman gambar GPT-4 Vision, atau API lain yang memerlukan unggah file, prinsip intinya tetap sama.
Direkomendasikan untuk menggunakan APIYI apiyi.com guna memvalidasi fungsi unggah file dengan cepat, merasakan antarmuka API yang seragam, dan dukungan teknis yang mendalam.
Penulis: APIYI Team | Fokus pada berbagi teknologi API Model Bahasa Besar AI
Diskusi Teknis: Kunjungi apiyi.com untuk mendapatkan lebih banyak sumber daya pengembangan API
Referensi
-
RFC 2388: Spesifikasi standar multipart/form-data
- Tautan:
tools.ietf.org/html/rfc2388
- Tautan:
-
Dokumentasi resmi curl: Multipart Formposts
- Tautan:
everything.curl.dev/http/post/multipart
- Tautan:
-
MDN Web Docs: Menggunakan Objek FormData
- Tautan:
developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest_API/Using_FormData_Objects
- Tautan:
-
Dokumentasi OpenAI Sora API: Panduan Pembuatan Video
- Tautan:
platform.openai.com/docs/guides/video-generation
- Tautan:
