Cara Upload File Pada Codeigniter 4 #12

Setelah selesai dengan Cara Menghapus Data Pada Codeigniter 4 #10 dan Cara Mengubah Data Pada Codeigniter 4 #11 sekarang fokus kita adalah bagaimana cara upload file berupa gambar pada halaman tambah data, langkah awalnya kita edit terlebih dahulu file create.php pada folder Views\buku\crud\create.php , Langkah pertama silahkan edit pada bagian sampul, buat seperti code dibawah :

                 <!-- Cara Upload File Pada Codeigniter 4 #12 -->
                <div class="row mb-3">
                    <label for="cover" class="col-sm-2 col-form-label">Cover</label>
                    <div class="col-sm-10">
                        <input class="form-control <?= ($validation->hasError('cover')) ? 'is-invalid' : ''; ?>" type="file" id="cover" name="cover">
                        <div id="validationServer03Feedback" class="invalid-feedback">
                            <?= $validation->getError('cover'); ?>
                        </div>
                    </div>
                </div>
                <!-- End -->

Setelah itu pada form tambahkan enctype agar form bisa bekerja dengan GET, POST dan FILES, code nya seperti berikut :

enctype="multipart/form-data"

Maka hasilnya seperti gambar berikut :

Setelah itu modifikasi code yang ada methode simpan pada controller Crud.php seperti code dibawah ini :

    public function simpan()
    {

        // validasi input
        if (!$this->validate([
            'judul' => [
                'rules'         => 'required|is_unique[buku.judul]',
                'errors'        => [
                    'required'  => '{field} buku harus di isi.',
                    'is_unique' => '{field} buku sudah terdaftar'
                ]
            ],
            // untuk validasi gambar bisa cek pada dokumentasi codeigniter https://www.codeigniter.com/user_guide/libraries/validation.html
            'cover' => [
                'rules'         => 'uploaded[cover]|is_image[cover]|mime_in[cover,image/jpg,image/jpeg,image/png]',

                'errors'        => [
                    'uploaded'  => 'Cover buku harus dipilih.',
                    'is_image'  => 'Yang anda pilih bukan gambar.',
                    'mime_in'   => 'Cover buku harus berekstensi png,jpg,gif.'
                ]
            ]

        ])) {
            //$validation = \Config\Services::validation();
            //return redirect()->to('/crud/create')->withInput()->with('validation', $validation);
            return redirect()->to('/crud/create')->withInput();
        }

        //ambil terlebih dulu gambarnya
        $fileCover = $this->request->getFile('cover');
        //lalu pindahkan file kedalam folder img
        $fileCover->move('img');
        //ambil nama file cover
        $namaCover = $fileCover->getName();

        // rl_title digunakan untuk membuat field slug pada database terisi otomatis
        $slug = url_title($this->request->getVar('judul'), '-', true);

        $this->BukuModel->save([
            'judul'     => $this->request->getVar('judul'),
            'slug'      => $slug,
            'penulis'   => $this->request->getVar('penulis'),
            'penerbit'  => $this->request->getVar('penerbit'),
            'cover'     => $namaCover
        ]);

        session()->setFlashdata('pesan', 'Data berhasil ditambahkan.');
        return redirect()->to('/buku');
    }

Maka hasilnya akan seperti gambar dibawah ini :

Untuk membuat file sampul cover tidak harus di isi kita bisa menggunakan gambar default yang kita inginkan, yaitu dengan cara sebagai berikut :

    public function simpan()
    {

        // validasi input
        if (!$this->validate([
            'judul' => [
                'rules'         => 'required|is_unique[buku.judul]',
                'errors'        => [
                    'required'  => '{field} buku harus di isi.',
                    'is_unique' => '{field} buku sudah terdaftar'
                ]
            ],
            // untuk validasi gambar bisa cek pada dokumentasi codeigniter https://www.codeigniter.com/user_guide/libraries/validation.html
            'cover' => [
                'rules'         => 'is_image[cover]|mime_in[cover,image/jpg,image/jpeg,image/png]',

                'errors'        => [
                    //'uploaded'  => 'Cover buku harus dipilih.',
                    'is_image'  => 'Yang anda pilih bukan gambar.',
                    'mime_in'   => 'Cover buku harus berekstensi png,jpg,gif.'
                ]
            ]

        ])) {
            //$validation = \Config\Services::validation();
            //return redirect()->to('/crud/create')->withInput()->with('validation', $validation);
            return redirect()->to('/crud/create')->withInput();
        }

        //VERSI GAMBAR WAJIB DI UPLOAD
        //ambil terlebih dulu gambarnya
        //$fileCover = $this->request->getFile('cover');
        //lalu pindahkan file kedalam folder img
        //$fileCover->move('img');
        //ambil nama file cover
        //$namaCover = $fileCover->getName();

        //VERSI GAMBAR TIDAK WAJIB DI UPLOAD DAN LANGSUNG DI RENAME
        //ambil terlebih dulu gambarnya
        $fileCover = $this->request->getFile('cover');
        //cek apakah tidak ada gambar yang di upload
        if ($fileCover->getError() == 4) {
            $namaCover = 'default.png';
        } else {
            //generate nama cover acak
            $namaCover = $fileCover->getRandomName();
            //pindahkan file cover
            $fileCover->move('img', $namaCover);
        }

        // rl_title digunakan untuk membuat field slug pada database terisi otomatis
        $slug = url_title($this->request->getVar('judul'), '-', true);

        $this->BukuModel->save([
            'judul'     => $this->request->getVar('judul'),
            'slug'      => $slug,
            'penulis'   => $this->request->getVar('penulis'),
            'penerbit'  => $this->request->getVar('penerbit'),
            'cover'     => $namaCover
        ]);

        session()->setFlashdata('pesan', 'Data berhasil ditambahkan.');
        return redirect()->to('/buku');
    }

Hasilnya adalah seperti gambar dibawah ini :