Cara Termudah Membuat fitur upload dan download file di Laravel 10.X
Laravel 10.x API + sanctum
Hi, my name is Hasban Fardani. I am a fullstack developer living in Cimahi, Indonesia. I currently study at SMKN 11 Bandung majoring in Software Engineering and Development.
Terkadang dalam membuat sebuah aplikasi fullstack kita memerlukan sebuah fitur untuk upload dan mendownload sebuah file. Di laravel sendiri terdapat banyak sekali cara yang bisa kamu gunakan, namun bagaimana cara 'termudah' yang bisa kita lakukan? Berikut saya berikan contohnya
Membuat Aplikasi Laravel
sebelum masuk ke fitur utama mari kita membuat aplikasi laravelnya terlebih dahulu dengan menajalankan perintah
composer create-project laravel/laravel=10.0.0 UploadDownload
setelah selesai buka folder aplikasi menggunakan text editor favorit kalian, di sini saya menggunakan vscode.
Konfigurasi .env
buka file .env lalu masukkan nama database dan username beserta password mysql kalian, berikut contoh file .env saya
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_file_manajement
DB_USERNAME=root
DB_PASSWORD=
Link storage
laravel memiliki package Storage yang sangat membantu dalam menghandle file file storage, namun sebelum itu kita harus melakukan symlink terlebih dahulu agar nantinya file kita bisa diakses oleh public.
php artisan storage:link
Membuat Model, Migration dan Controller
ketikan perintah berikut
php artisan make:model File -m --api
Penjelasan: -m adalah flag untuk membuat migration dan --api adalah untuk membuat apiResource.
Migration file
tuliskan kode berikut didalam method up pada migration yang baru saja kita buat
Schema::create('files', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('path');
$table->timestamps();
});
Migrate Database
php artisan migrate
Buat kode untuk Fitur upload
buka FileController
buat kode seperti berikut
public function upload(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required',
'file' => 'required|file'
]);
if ($validator->fails()){
return response()->json([
'message' => 'invalid field',
'errors' => $validator->errors()
]);
}
// Mendapatkan file dari request
$file = $request->file('file');
// membuat nama file sesuai dengan input request + ext file asli
$filename = $request->input('name').'.'.$file->getClientOriginalExtension();
// store file di folder public
$path = $file->storeAs('/', name: $filename, options: 'public');
// menyimpan data ke database
$file = File::create([
'path' => $path,
'name' => $request->input('name')
]);
return response()->json([
'file' => $file
]);
}
Mari kita fokus pada bagian kode ini
// Mendapatkan file dari request
$file = $request->file('file');
// membuat nama file sesuai dengan input request + ext file asli
$filename = $request->input('name').'.'.$file->getClientOriginalExtension();
// store file di folder public
$path = $file->storeAs('/', name: $filename, options: 'public');
pada kode tersebut pertama - tama kita mengambil file dari $request dengan nama 'file' lalu kita simpan file menggunakan method storeAs() yang memiliki 3 parameter yaitu path, $filename, dan options. path adalah parameter wajib sedangkan yang lain adalah optional.
options: 'public' didapat dari config disks yang berada pada file config/filesystem.php

Routes API
buka file routes/api.php lalu kita buat route untuk upload file
Route::post('upload', [FileController::class, 'upload']);
Testing aplikasi
jalankan perintah
php artisan serverbuat request dengan method post ke url http://localhost:8000/upload
ubah body menjadi form-data lalu masukkan data berupa name dan file
untuk file kita perlu ubah tipenya menjadi file

Hasilnya kurang lebih akan seperti ini:

Buat fitur untuk Download
Setting Route
buka kembali file api.php lalu tambahkan kode berikut
Route::get('download/{file:name}', [FileController::class, 'download']);
Tambahkan method download pada FileController
buka kembali FileController lalu tambahkan kode berikut
public function download(File $file)
{
return response()->download(Storage::disk('public')->path($file->path));
}
Testing postman
buka postman lalu buat request get dengan url http://localhost:8000/api/test_file1 (sesuaikan dengan nama file pada req sebelumnya)
maka hasilnya kurang lebih akan seperti ini

atau jika anda membukanya lewat browser maka akan otomatis terdownload atau muncul popup file manajer seperti ini

Kesimpulan
untuk menyimpan file di laravel anda harus melakukan symlink terlebih dahulu agar folder storage public dapat diakses secara public
gunakan
$request->file('nama_file')->storeAs($path, $name, $option)untuk menyimpan file dengan nama kostum dengan path dan options yang bisa disesuaikanuntuk mendapatkan path dari file public yang sudah diupload anda harus menggunakan
Storage::disk('public')->path('path');
Terimakasih sudah membaca mohon maaf masih banyak kekurangan.
Jangan lupa titik koma;
:)
