Catatan Belajar Upload File di Laravel ke Folder Public
Kenapa Saya Belajar Ini
Hari ini saya butuh fitur upload sederhana di Laravel. Syaratnya cuma satu: file hasil upload harus disimpan di folder public, bukan di storage bawaan Laravel.
Saya ingin prosesnya jelas, rapi, dan tidak menumpuk file tertinggal (orphan) yang sudah tidak dipakai lagi. Kadang hal yang kelihatannya simpel justru punya detail yang mudah terlewat, jadi saya dokumentasikan supaya besok-besok tidak lupa.
Apa yang Saya Pelajari
Ternyata proses upload ke folder public itu cukup langsung, selama tahu urutannya.
Cek dulu apakah request membawa file.
Menghindari error dan mengurangi logika yang tidak perlu.Ambil file, buat nama unik dengan
hashName().
Supaya tidak bentrok dengan file lain. Laravel sudah menyediakan fungsi hashing bawaan.Pindahkan file ke folder
public/uploads.
Foldernya harus sudah ada.move()langsung bekerja dengan path absolut sepertipublic_path('uploads').Simpan nama file ke dalam data yang akan diinsert.
Contoh implementasi store-nya jadi seperti ini:
public function store(Request $request)
{
$validated = $request->validate([
'nama' => 'required',
'foto' => 'nullable|image|max:5000',
]);
if ($request->hasFile('foto')) {
$file = $request->file('foto');
$filename = $file->hashName();
$file->move(public_path('uploads'), $filename);
$validated['foto'] = $filename;
}
Seragam::create($validated);
return redirect()->route('seragam.index')->with(['success' => 'Data berhasil disimpan']);
}
Untuk proses update, langkahnya hampir sama, hanya ditambah pengecekan dan penghapusan file lama supaya folder tidak penuh file dari data yang lama.
if ($request->hasFile('foto')) {
// hapus foto lama kalau masih ada
if ($seragam->foto && file_exists(public_path('uploads/' . $seragam->foto))) {
unlink(public_path('uploads/' . $seragam->foto));
}
$file = $request->file('foto');
$filename = $file->hashName();
$file->move(public_path('uploads'), $filename);
$validated['foto'] = $filename;
}
Di bagian delete (destroy), logikanya sama: bersihkan file dulu sebelum menghapus datanya.
if ($seragam->foto && file_exists(public_path('uploads/' . $seragam->foto))) {
unlink(public_path('uploads/' . $seragam->foto));
}
$seragam->delete();
Untuk menampilkan foto di view blade-nya bisa menggunakan asset
<img src="{{ asset('uploads/' . $seragam->foto) }}" width="150">
Secara umum, pendekatan ini sudah aman dan rapi untuk kasus upload sederhana.
Tambahan kecil yang menurut saya penting:
- Pastikan permission folder
public/uploadssudah benar (bisa di write). - Untuk aplikasi skala besar, biasanya file diletakkan di storage dan dilink ke folder public, tapi untuk kasus tertentu (seperti aplikasi internal atau kebutuhan cepat) menyimpan langsung di public masih relevan. Apalagi kalau masih menggunakan shared hosting yang resources-nya terbatas.
- Jika suatu saat butuh versi thumbnail, resize, atau filter gambar, lebih baik gunakan package seperti
intervention/image.
Insight
Ternyata proses upload di Laravel cukup to the point. Tidak banyak langkah teknis yang rumit. Selama memahami alurnya, cek file → buat nama unik → pindah → simpan ke database.
Yang paling penting bagi saya adalah kebiasaan kecil: hapus file lama sebelum menyimpan yang baru. Ini hal sederhana, tapi menyelamatkan folder dari menumpuknya file-file tak terpakai yang sering jadi masalah di kemudian hari (storage penuh dengan file lama dari data yang lama).
Upload file ke folder public mungkin bukan cara paling “ideal” secara teori Laravel, tapi untuk kasus praktis, pendekatan ini cepat, jelas, dan relatif mudah.
