Skip to main content

Command Palette

Search for a command to run...

Cara Termudah Membuat fitur upload dan download file di Laravel 10.X

Laravel 10.x API + sanctum

Updated
3 min read
H

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=

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

  1. jalankan perintah php artisan server

  2. buat request dengan method post ke url http://localhost:8000/upload

  3. ubah body menjadi form-data lalu masukkan data berupa name dan file

  4. untuk file kita perlu ubah tipenya menjadi file

  5. 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

  1. untuk menyimpan file di laravel anda harus melakukan symlink terlebih dahulu agar folder storage public dapat diakses secara public

  2. gunakan $request->file('nama_file')->storeAs($path, $name, $option) untuk menyimpan file dengan nama kostum dengan path dan options yang bisa disesuaikan

  3. untuk 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;

:)