Upload Berkas & Storage

Menyimpan berkas unggahan dengan Storage facade, disk public, storage:link, dan validasi gambar.

Part 18 dari 26 ± 35 menit Gratis

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

DiskLokasiKegunaan
localstorage/app/privateBerkas pribadi (tidak bisa diakses langsung lewat URL)
publicstorage/app/publicBerkas publik seperti foto produk
s3Bucket S3Produksi 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

  • image atau mimes:jpg,png,webp — jangan percaya ekstensi saja; Laravel memeriksa tipe MIME sebenarnya.
  • max:2048 (KB). Sesuaikan juga upload_max_filesize dan post_max_size di php.ini.
  • dimensions:max_width=2000 untuk batas ukuran piksel.
  • Berkas privat (dokumen, kontrak) simpan di disk local dan sajikan lewat controller yang memeriksa otorisasi.

Jangan lakukan

  • Menyimpan berkas unggahan di public/ langsung dengan nama asli dari pengguna.
  • Mengeksekusi/meng-include berkas unggahan.
  • Lupa menghapus berkas lama saat diganti → ruang disk terbuang.

Praktikkan langsung, gratis

Tulis dan jalankan kode langsung di browser, dapatkan penilaian otomatis. Daftar gratis kapan saja untuk menyimpan progres dan meraih sertifikat.

Coba latihan sekarang, tanpa daftar
Bagikan: WhatsApp Facebook LinkedIn X