
Pendahuluan
Bayangin lagi ngerjain fitur upload video 1GB di project Laravel, tapi tiba-tiba request-nya terputus karena server timeout. Biasanya kita frustrasi karena setting post_max_size di PHP.ini udah dinaikin tapi masih aja gagal di tengah jalan. Solusinya bukan cuma mainin limit server, tapi memecah file jadi bagian-bagian kecil (chunk) agar proses upload jauh lebih tangguh.
Tips & Best Practices
- Di banyak project, biasanya saya mulai dari bikin mekanisme verifikasi hash. Jangan asal terima potongan file, pastikan ada checksum MD5 agar kita tahu tiap chunk sampai dengan utuh tanpa corrupt.
- Untuk manajemen storage, saya selalu pisahin direktori temporary buat chunk yang belum selesai. Jangan simpan langsung di folder storage/app/uploads biar aplikasi nggak berantakan pas proses penggabungan gagal.
- Biasanya saya pakai event-driven approach untuk proses penggabungan. Pas chunk terakhir sampai, trigger background job biar user nggak nunggu lama di browser padahal file lagi di-merge di background.
Contoh Kode
Ini cara saya nangkap chunk di Controller buat nyusun file jadi satu kesatuan:
public function upload(Request $request) {
$chunk = $request->file('file');
$path = storage_path('app/temp/' . $request->uid);
// Nambahin chunk ke file utama tanpa harus load semua ke RAM
file_put_contents($path, file_get_contents($chunk->getRealPath()), FILE_APPEND);
if ($request->is_last) {
// Pindahkan ke lokasi final setelah semua chunk lengkap
Storage::move('temp/' . $request->uid, 'uploads/' . $request->name);
}
return response()->json(['status' => 'chunk_received']);
}Variasi Implementasi
Pilihan ada dua: pakai library pihak ketiga kayak Resumable.js di front-end yang udah handle retry otomatis, atau nulis custom logic pakai Axios kalau mau lebih ringan. Kalau project-nya kompleks dan butuh reliability tinggi, saya lebih suka pakai tus.io protocol karena dia emang standar industri buat upload file yang bisa dijeda dan dilanjutin (resumable).
Kesalahan Umum
- Lupa ngebersihin folder temporary, akhirnya disk penuh gara-gara sisa chunk yang gagal upload.
- Nggak ngecek apakah disk space mencukupi sebelum merge file.
- Terlalu mengandalkan session, padahal kalau network drop, session sering nggak ke-save dengan baik.
- Nggak ada mekanisme retry di sisi client kalau chunk gagal di-upload.
- Pake cara sinkron (blocking) buat merge file besar, yang bikin aplikasi berasa nge-hang buat user lain.
Ringkasan
Intinya, handling file besar bukan soal gimana kita paksa server nerima beban berat, tapi gimana kita bisa bagi beban itu jadi kecil-kecil biar lebih kalem dikelola. Setelah ngalamin sendiri gagal upload berkali-kali, saya sadar kalau ketenangan user lebih penting daripada sekadar kodingan yang kelihatan simpel.
Komentar
Posting Komentar