Laravel File Upload merupakan salah satu bagian dari fungsi form yang dipergunakan untuk mengunggah atau mengupload file pada server. Penggunaan fitur ini misalnya pada halaman profil, maka pengguna dapat mengisikan form untuk berbagai data profil termasuk mengupload foto yang akan difungsikan sebagai foto profil. Untuk keperluan Laravel File Upload ini disediakan abstraksi sistem file melalui modul PHP Flysystem yang menyediakan driver yang dapat dipergunakan untuk bekerja dengan filesystem lokal, Amazon S3, dan Rackspace Cloud Storage.

Membuat Laravel File Upload

Berikut adalah beberapa hal yang perlu diperhatikan untuk mengimplementasikan Laravel File Upload, yaitu terkait dengan File System, Multipart Form Data, Symlink, dan Enctype.

File System

  • Konfigurasi terdapat pada config/filesystems.php
Konfigurasi File Systems

Konfigurasi File Systems

  • Public Disk
    • Publik Disk merupakan tempat penyimpanan yang ditujukan untuk meletakkan file yang akan dapat diakses publik.
    • Secara default, disk publik adalah penyimpanan lokal pada folder storage/app/public.
    • Agar folder tersebut dapat diakses dari web, maka perlu dibuat symbolic link dari public/storage ke storage/app/public.
    • Dengan symbolic link kedua folder akan berisi file yang sama, namun file tidak dicopykan
  • Pembuatan Symbolic Links melalui perintah Artisan:
    $ php artisan storage:link

Link ke folder public

Link ke folder public

Pembuatan Symbolic Link

Pembuatan Symbolic Link

  • Setelah symbolic link dibuat, maka file akan dapat diakses public dengan menggunakan function asset untuk menghasilkan link yang sesuai
  • Berikut contoh untuk menampilkan isi file.txt yang terletak di folder public/storage
    echo asset(‘storage/file.txt’);
  • The Local Driver
    • Pada saat menggunakan driver lokal, semua operasi file adalah relatif terhadap folder root yang ditentukan dalam file konfigurasi, dimana defaultnya adalah: storage/app
    • Berikut contoh potongan program untuk menyimpan file di storage/app/file.txt:
      Storage::disk(‘local’)->put(‘file.txt’, ‘Contents’);
    • Penggunaan Storage harus diawali dengan perintah:
      use Illuminate\Support\Facades\Storage;
  • Mengambil atau Membaca File
    • Untuk memgambil file dapat dipergunakan method get. Jangan lupa bahwa file akan diambil pada folder root storage sesuai konfigurasi
      $contents = Storage::get(‘file.jpg’);
    • Untuk memastikan bahwa file yang akan diambil tersedia, dapat dipergunakan method exist
      $exists = Storage::disk(‘local’)->exists(‘file.jpg’);
  • Mendownload File
    • Method download dapat dipergunakan untuk memberikan respon untuk meminta browser mendownload sebuah file.
    • File name yang terdapat di parameter kedua merupakan nama file yang akan dilihat user pada saat mendownload file.
    • Parameter ketiga merupakan HTTP headers
      return Storage::download(‘file.jpg’);
      return Storage::download(‘file.jpg’, $name, $headers);
  • Untuk menghasilkan sebuah URL menuju file dimaksud, dapat digunakan method url pada Storage
    $url = Storage::url(‘file.jpg’);
  • Berikut adalah fungsi untuk menyalin dan memindahkan sebuah file ke file lain
    Storage::copy(‘old/file.jpg’, ‘new/file.jpg’);
    Storage::move(‘old/file.jpg’, ‘new/file.jpg’);

File Uploads

  • Berikut adalah Langkah Pembuatan File Uploads
    • Membuat symlink
    • Pada controller yang memanfaatkan class Storage:
      use Illuminate\Support\Facades\Storage;
    • Buat form dengan enctype ‘multipart/form-data’
    • Buat elemen form File Upload
    • Validasi file
    • Simpan file di server

Tutorial Laravel File Upload

Tutorial berikut adalah menambahkan file upload gambar pada blog post.

Membuat symlink

  • Buat symlink terlebih dahulu, supaya file nantinya dapat diakses public
  • Semua file yang ada di storage/app/public akan dapat diakses pada public/storage
Membuat Symlinks

Membuat Symlinks

Menambahkan Enctype

  • Silahkan menambahkan enctype di Form::open
Copy to Clipboard

Tambahkan Tombol File Upload

  • Buka file create.blade.php
  • Tambahkan perintah Form untuk menampilkan tombol File Upload
Copy to Clipboard
Tombol Pemilihan File

Tombol Pemilihan File

Menambahkan Tabel untuk menyimpan nama file

  • Untuk menyimpan nama file maka perlu ditambahkan sebuah field column di tabel posts, untuk itu dibuat sebuah migration
Migrations menambah field nama file pada table

Migrations menambah field nama file pada table

  • Tambahkan column foto

Migration Tabel Foto - Up

Migration Tabel Foto – Up

Migration Tabel Foto - Down

Migration Tabel Foto – Down

  • Setelah menjalankan migrations check database via phpMyAdmin
Hasil Running Migrations

Hasil Running Migrations

Mengubah PostsController

Ada beberapa hal yang perlu ditambahkan di Posts Controller untuk memvalidasi dan menyimpan file di dalam database maupun di local storage

Isi PostsController

Isi PostsController

Validasi Image

  • Pada contoh ini file upload dipergunakan untuk menyimpan image, maka perlu dilakukan validasi untuk memastikan file yang diupload adalah image (parameter pertama)
  • nullable di parameter kedua artinya opsional, boleh tidak ada
  • max untuk membatasi ukuran file yang diupload (bytes)
Validasi Image

Validasi Image

Memeriksa File Upload

Untuk memeriksa apakah user mengupload file dengan memanfaatkan form, dapat diperiksa dengan method hasfile

Copy to Clipboard

Nama File Unik

  • Program harus memastikan bahwa nama file unik, ada kemungkinan user akan mengupload foto dengan nama yang sama, misalnya foto.jpg, ada kemungkinan akan dipergunakan berulang kali.
  • Pada contoh berikut akan dilakukan pengambilan nama file tanpa extension, kemudian pengambilan extension.
  • Nama file yang disimpan di database termasuk penyimpanan di local storage akan menggunakan format namaFileTanpaExt_waktuUpload.extension
Copy to Clipboard
  • Dengan menggunakan method storeAs bisa ditetapkan lokasi penyimpanan dan juga nama file yang diinginkan
Copy to Clipboard
Potongan Program File Upload

Potongan Program File Upload

  • Program sebelumnya hanya menyimpan file di server, belum termasuk penyimpanan data. Tambahkan di controller.
Nama Laravel File Upload Yang Disimpan

Nama Laravel File Upload Yang Disimpan

  • Silahkan dicoba untuk menjalankan program

Tampilan Form File Upload

Tampilan Form File Upload

Berhasil Menambahkan data termasuk File Foto

Berhasil Menambahkan data termasuk File Foto

Written by: SEW 20191115