Mengganti foto produk atau menghapus data harus disertai dengan penghapusan file gambar di storage, agar storage server tidak penuh oleh file sampah. Laravel menyediakan cara efisien untuk melakukan ini melalui helper File atau Storage.


๐ŸŽฏ Tujuan Part 4


๐Ÿ“ Struktur Penyimpanan File

Di part sebelumnya kita menyimpan foto ke:

/public/uploads/produk/

Contoh path hasil upload:

public/uploads/produk/1718545800.jpg

๐Ÿ”„ 1. Update Produk dengan Ganti Gambar

Edit update() di ProdukController.php:

use Illuminate\Support\Facades\File;

public function update(Request $request, $id)
{
    $request->validate([
        'nama'  => 'required',
        'harga' => 'required|numeric',
        'foto'  => 'nullable|image|mimes:jpeg,png,jpg|max:2048'
    ]);

    $produk = Produk::findOrFail($id);

    $fotoLama = $produk->foto;

    // Jika ada foto baru diunggah
    if ($request->hasFile('foto')) {
        // Hapus file lama jika ada
        if ($fotoLama && File::exists(public_path('uploads/produk/' . $fotoLama))) {
            File::delete(public_path('uploads/produk/' . $fotoLama));
        }

        // Simpan file baru
        $fotoBaru = time() . '.' . $request->foto->extension();
        $request->foto->move(public_path('uploads/produk'), $fotoBaru);
        $produk->foto = $fotoBaru;
    }

    // Update data lainnya
    $produk->nama = $request->nama;
    $produk->harga = $request->harga;
    $produk->save();

    return redirect()->route('produk.index');
}

๐Ÿ—‘๏ธ 2. Hapus Produk & File Gambar

Edit destroy() di ProdukController.php:

public function destroy($id)
{
    $produk = Produk::findOrFail($id);

    // Hapus file gambar jika ada
    if ($produk->foto && File::exists(public_path('uploads/produk/' . $produk->foto))) {
        File::delete(public_path('uploads/produk/' . $produk->foto));
    }

    $produk->delete();

    return redirect()->route('produk.index');
}

๐Ÿ” Keamanan: Cek Eksistensi File

Pastikan selalu gunakan:

File::exists(path) && File::delete(path)

Agar tidak muncul error jika file sudah tidak ada atau pernah dipindahkan.


๐Ÿ“ฆ Alternatif: Gunakan Storage Laravel

Jika kamu menggunakan Laravel Storage:

use Illuminate\Support\Facades\Storage;

Storage::delete('public/produk/' . $produk->foto);

Tentu pastikan kamu menyimpan foto dengan:

$request->foto->storeAs('public/produk', $namaFile);

๐Ÿง  Best Practice

HalRekomendasi
Nama file unikGunakan time(), UUID, atau Str::random()
Hindari overwrite fileJangan simpan dengan nama yang sama kecuali dibutuhkan
Validasi ekstensi dan sizeBatasi mimes:jpg,png dan max:2048
Soft deleteGunakan jika ingin backup sebelum file benar-benar dihapus (optional)

๐Ÿงฐ Elektra Network Vision โ€“ Konsultan Laravel & File Manajemen

Kami bantu Anda:

๐ŸŒ elektranetworkvision.com โ€” Spesialis sistem Laravel profesional, cocok untuk UMKM hingga enterprise.

Leave a Reply

Your email address will not be published. Required fields are marked *