Pada tutorial belajar Laravel bagian 25, kita telah mempelajari cara mengunggah file ke database serta menampilkan preview dari file yang berhasil diunggah. Nah, pada seri belajar Laravel bagian 26 ini, kita akan melanjutkan pembahasan dengan mempelajari cara menghapus file dari database di Laravel.
Update Controller
Silakan edit file app/Http/Controllers/FileController.php untuk menambahkan method hapus, yang akan kita beri nama dengan method destroy
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\File;
use Illuminate\Support\Facades\Storage;
class FileController extends Controller
{
public function index()
{
$files = File::all();
return view('upload', compact('files'));
}
public function store(Request $request)
{
// Validasi
$request->validate([
'file' => 'required|mimes:jpg,jpeg,png,pdf|max:2048'
]);
// Simpan file ke storage/app/public/uploads
$path = $request->file('file')->store('uploads', 'public');
// Simpan ke database
$file = new File();
$file->name = $request->file('file')->getClientOriginalName();
$file->path = $path;
$file->save();
return back()->with('success', 'File berhasil diupload!');
}
public function destroy($id)
{
$file = File::findOrFail($id);
// Hapus file fisik di storage
if (Storage::disk('public')->exists($file->path)) {
Storage::disk('public')->delete($file->path);
}
// Hapus dari database
$file->delete();
return back()->with('success', 'File berhasil dihapus!');
}
}
Update Routes
Selanjutnya edit file routes/web.php. Tambahkan Route delete.
use App\Http\Controllers\FileController;
Route::get('/upload', [FileController::class, 'index']);
Route::post('/upload', [FileController::class, 'store']);
Route::delete('/upload/{id}', [FileController::class, 'destroy'])->name('upload.destroy');Update View
Selanjutnya edit untuk tampilan pada file resources/views/upload.blade.php. Untuk menambahkan tombol Hapus di dalam tabel:
<!DOCTYPE html>
<html>
<head>
<title>Upload File Laravel ke Database</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-5">
<h2 class="mb-4">Upload File ke Database</h2>
{{-- Pesan sukses --}}
@if(session('success'))
<div class="alert alert-success">{{ session('success') }}</div>
@endif
{{-- Error --}}
@if($errors->any())
<div class="alert alert-danger">
<ul class="mb-0">
@foreach ($errors->all() as $err)
<li>{{ $err }}</li>
@endforeach
</ul>
</div>
@endif
<!-- Form Upload -->
<div class="card shadow mb-4">
<div class="card-body">
<form action="/upload" method="POST" enctype="multipart/form-data">
@csrf
<div class="mb-3">
<label class="form-label">Pilih File</label>
<input type="file" name="file" class="form-control">
</div>
<button type="submit" class="btn btn-primary">Upload</button>
</form>
</div>
</div>
<!-- List File -->
<h4>Daftar File</h4>
<table class="table table-bordered align-middle">
<thead class="table-dark">
<tr>
<th>No</th>
<th>Nama File</th>
<th>Preview</th>
<th>Aksi</th>
</tr>
</thead>
<tbody>
@forelse($files as $index => $f)
<tr>
<td>{{ $index+1 }}</td>
<td>{{ $f->name }}</td>
<td>
@php $ext = pathinfo($f->path, PATHINFO_EXTENSION); @endphp
@if(in_array($ext, ['jpg','jpeg','png']))
<img src="{{ asset('storage/'.$f->path) }}" class="img-thumbnail" style="max-width:100px;">
@elseif($ext == 'pdf')
<a href="{{ asset('storage/'.$f->path) }}" target="_blank" class="btn btn-danger btn-sm">Lihat PDF</a>
@else
<a href="{{ asset('storage/'.$f->path) }}" target="_blank" class="btn btn-secondary btn-sm">Download</a>
@endif
</td>
<td>
<form action="{{ route('upload.destroy', $f->id) }}" method="POST" onsubmit="return confirm('Yakin hapus file ini?')">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger btn-sm">Hapus</button>
</form>
</td>
</tr>
@empty
<tr>
<td colspan="4" class="text-center">Belum ada file</td>
</tr>
@endforelse
</tbody>
</table>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>Storage Link
Terakhir memastikan symbolic link sudah dibuat. Jalankan perintah berikut
php artisan storage:linkLakukan Testing
Silakan akses http:127.0.0.1/upload kemudian upload file (jpg/png/pdf). File yang diupload tersebut akan disimpan di folder storage dan akan masuk ke dalam path database.

Lakukan hapus file dengan tekan tombol Hapus. Saat tombol ini di klik, akan tampil popup yang mengkonfirmasi apakah Anda benar ingin menghapus file tersebut?
Saat Anda klik Oke, maka file akan dihapus, dan informasi path di database juga akan dihapus.

Penutup
Sekarang, Anda telah mempelajari cara menghapus file dari database menggunakan Laravel. Dengan langkah ini, fitur upload file pada aplikasi Laravel Anda menjadi lebih lengkap karena sudah dilengkapi dengan fungsi untuk menghapus file yang tidak lagi dibutuhkan.
Demikian tutorial belajar Laravel bagian 26 tentang cara menghapus file dalam database di Laravel. Ikuti terus seri belajar Laravel selanjutnya dari Rumahweb Indonesia, agar kemampuan Laravel Anda semakin meningkat. Semoga bermanfaat.



