Upload Multiple File Menggunakan Filesystem di Laravel


Tulisan dengan bahasan upload multiple file (unggah banyak berkas) ini masih berhubungan dengan tutorial sebelumnya yang membahas Upload File Menggunakan Filesystem Laravel. Jadi, sebelum melanjutkan membaca tulisan ini, penting untuk kalian sudah paham betul konsep unggah berkas di PHP, khususnya Laravel. Tak kalah penting, kalian sudah mencoba sendiri membuat aplikasi serupa dan berjalan sesuai dengan semestinya.

Tulisan ini merupakan bagian ke 2 dari total 2 dalam seri Upload File.

Karena masih berhubungan dengan tulisan sebelumnya, maka di bagian ini tidak dijelaskan secara rinci komponen yang harus dibuat. Alih-alih, kita akan memodifikasi beberapa berkas yang sudah ada.

Beberapa hal masih menggunakan fitur pada contoh aplikasi sebelumnya, seperti pangkalan data, symbolic link, sampai dengan view. Agar tidak kebingungan, akan lebih baik kalian menggunakan contoh aplikasi pada repositori berikut.

***

Pada dasarnya, ada tiga hal yang harus disesuaikan agar fitur aplikasi yang dibuat mendukung unggah banyak berkas sekaligus.

  1. Mengubah bentuk form menjadi array.
  2. Memvalidasi berkas satu persatu.
  3. Memroses data berkas yang berbentuk array untuk diunggah satu persatu dalam perulangan (looping) dan menyimpannya ke dalam pangkalan data.

Mengubah Bentuk Form

Di tampilan sebelumnya, form dapat ditulis dengan sintaks HTML seperti berikut:

<input type="file" name="file">

Dengan menambahkan simbol kurung siku pembuka dan penutup pada input file, bahasa pemrograman PHP otomatis akan menganggapnya sebagai data array. Nilai dalam kurung siku sebenarnya bisa diisi sebagai indeks array. Apabila dikosongkan, maka otomatis akan diisi berupa angka dimulai dari nol.

<input type="file" name="files[]">
<input type="file" name="files[]">
<input type="file" name="files[]">

Sebagai informasi, nama form-nya saya ubah menjadi files yang menandakan kalau input tersebut berupa array dan jumlahnya bisa lebih dari sama dengan satu (jamak).

Add File

Tambah berkas sesuka user

Formulir input file dapat ditambahkan sebanyak yang kalian mau. Di aplikasi nyata, penambahan formulir bisa dimanipulasi dengan JavaScript. Dengan bantuan jQuery misalnya.

Validasi Berkas

Laravel secara bawaan sudah mendukung validasi data dengan tipe array. Kalian hanya perlu menambahkan tanda * (asterisk) sebagai penanda validasi array dengan indeks apa saja.

$this->validate($request, [
    'title' => 'nullable|max:100',
    'file' => 'required|file|max:2000'
]);

Sesuai dengan nama input di view (formulir), yang pertama dilakukan adalah mengganti nama file menjadi files. Kemudian, menambahkan tanda * setelah tanda titik seperti pada format di bawah.

$this->validate($request, [
    'files.*' => 'required|file|max:2000'
]);

Sebagai referensi, kalian perlu membaca dan memahami cara validasi array di Laravel melalui dokumentasinya langsung.

Proses Unggah Berkas

Karena input berkasnya berbentuk array, maka kita perlu melakukan perulangan pada array tersebut, kemudian memroses datanya satu persatu untuk diunggah ke server.

Di skrip sebelumnya, kita dengan mudah dapat menulisnya sebagai berikut.

$uploadedFile = $request->file('file');        

$path = $uploadedFile->store('public/files');

Di fitur upload multiple file ini, kita dapat menuliskannya sebagai berikut.

$files = [];
foreach ($request->file('files') as $file) {
    if ($file->isValid()) {
        $path = $file->store('public/files');

        // save information to variable
        // next will be saved to database
        $files[] = [
            'title' => $file->getClientOriginalName(),
            'filename' => $path,
            'created_at' => $now = Carbon::now()->format('Y-m-d H:i:s'),
            'updated_at' => $now,
        ];
    }
}

File::insert($files);

return redirect()
    ->back()
    ->withSuccess(sprintf('Total %s berkas berhasil diunggah.', count($files)));

Dalam perulangan, mulai dari baris ketiga, kita melakukan pengecekan jika berkas benar-benar valid. Kemudian dipindahkan ke dalam storage server.

Skrip selanjutnya menambahkan beberapa informasi terkait berkas ke dalam variabel dengan nama $files yang sudah didefinisikan sebelum perulangan. Variabel ini digunakan untuk menyimpan banyak data dalam sekali menjalankan query SQL. Proses penyimpanan ke dalam pangkalan data dilakukan di luar perulangan, yaitu baris ke tujuh belas.

// contoh insert multiple data di SQL

insert into "files" ("created_at", "filename", "title", "updated_at") select '2017-12-30 07:55:57' as "created_at", 'public/files/yE4VphckRGmEvuIkPzS4SPzL8O8WLgqNbHDq4Dt0.png' as "filename", 'laravel-logo-white.png' as "title", '2017-12-30 07:55:57' as "updated_at" union all select '2017-12-30 07:55:57' as "created_at", 'public/files/rO8q0oPfpoklFIxrhvx4vl8GTqgMz46mTkxET0f3.jpeg' as "filename", 'laravel-from-scratch.jpg' as "title", '2017-12-30 07:55:57' as "updated_at"

Perhatikan, ketika menggunakan method Model::insert(), kita mendefinisikan created_at dan updated_at pada variabel $files. Hal ini dikarenakan pada method tersebut, data created_at dan updated_at tidak dibuat secara otomatis layaknya kita menggunakan method Model::create().

***

Terakhir, untuk melihat langsung implementasi fitur upload multiple file di Laravel, kalian dapat mengklik tautan demo berikut. Penambahan dan perubahan fitur apa saja yang berkaitan dengan fitur ini dapat dilihat pada commit repositori berikut.

1 comment

Tinggalkan Balasan