Upload Berkas & Storage
Menyimpan berkas unggahan dengan Storage facade, disk public, storage:link, dan validasi gambar.
Filesystem abstraksi
Laravel menyediakan lapisan penyimpanan seragam: kode yang sama menyimpan ke disk lokal, Amazon S3, atau layanan kompatibel S3 (R2, MinIO, DO Spaces) — cukup ganti konfigurasi di config/filesystems.php.
Disk bawaan
| Disk | Lokasi | Kegunaan |
|---|---|---|
local | storage/app/private | Berkas pribadi (tidak bisa diakses langsung lewat URL) |
public | storage/app/public | Berkas publik seperti foto produk |
s3 | Bucket S3 | Produksi skala besar |
Agar disk public bisa diakses web, buat tautan simbolik sekali:
php artisan storage:link # public/storage → storage/app/public
Menerima & menyimpan unggahan
<form method="POST" action="..." enctype="multipart/form-data"> {{-- WAJIB untuk upload --}}
@csrf
<input type="file" name="foto">
</form>
public function unggahFoto(Request $request, Produk $produk): RedirectResponse
{
$request->validate([
'foto' => ['required', 'image', 'max:2048'], // gambar, maks. 2 MB
]);
if ($produk->foto) {
Storage::disk('public')->delete($produk->foto); // hapus yang lama
}
$path = $request->file('foto')->store('produk', 'public'); // nama acak unik, folder "produk"
$produk->update(['foto' => $path]);
return back()->with('status', 'Foto diperbarui');
}
store($folder, $disk)menghasilkan nama berkas acak (aman dari tabrakan dan nama berbahaya) dan mengembalikan path relatif, mis.produk/Qx7...jpg. Simpan path ini di database — bukan berkas binernya.storeAs('produk', 'kopi.jpg', 'public')bila ingin nama sendiri.
Menampilkan
<img src="{{ Storage::disk('public')->url($produk->foto) }}">
<img src="{{ asset('storage/'.$produk->foto) }}">
Operasi Storage lain
Storage::put('catatan.txt', 'isi'); Storage::get('catatan.txt');
Storage::exists('catatan.txt'); Storage::delete('catatan.txt');
Storage::disk('public')->files('produk'); Storage::makeDirectory('laporan');
Storage::download('laporan.pdf'); // respons unduhan
Storage::disk('s3')->temporaryUrl($path, now()->addMinutes(10)); // URL sementara untuk berkas privat
Validasi unggahan yang aman
imageataumimes:jpg,png,webp— jangan percaya ekstensi saja; Laravel memeriksa tipe MIME sebenarnya.max:2048(KB). Sesuaikan jugaupload_max_filesizedanpost_max_sizediphp.ini.dimensions:max_width=2000untuk batas ukuran piksel.- Berkas privat (dokumen, kontrak) simpan di disk
localdan sajikan lewat controller yang memeriksa otorisasi.
Jangan lakukan
- Menyimpan berkas unggahan di
public/langsung dengan nama asli dari pengguna. - Mengeksekusi/meng-
includeberkas unggahan. - Lupa menghapus berkas lama saat diganti → ruang disk terbuang.