cara upload dan simpan file ke mysql di cakephp 4

Cara Upload dan Simpan File ke MySQL di CakePHP 4

Dalam tutorial ini, saya akan menunjukkan bagaimana Anda dapat upload file dengan validasi dan menyimpannya ke database MySQL di proyek CakePHP 4.

Menyimpan detail upload file dalam database mysql memberikan fleksibilitas dan kontrol yang lebih besar atas penanganan dan pengelolaan file. Anda dapat dengan mudah melacak siapa yang mengunggah file ini dan kapan menggunakannya.

Juga, menunjukkan bagaimana Anda dapat menampilkan file yang tersimpan pada halaman. Yuk ikuti langkah-langkah berikut ini.

1. Membuat Database

Langkah yang pertama yaitu kita perlu membuat database MySQL. Disini saya akan memberi nama database dengan cakephp4. Setelah itu, pada database tersebut jalankan query dibawah ini untuk membuat table.

CREATE TABLE `files` (
    `id` int(11) NOT NULL,
    `filename` varchar(255) NOT NULL,
    `path` varchar(255) NOT NULL
)

2. Configurasi Database

Selanjutnya, kita akan melakukan configurasi database. Tapi sebelum itu, Kamu harus membuat folder project terlebih dahulu. Kamu bisa menamai folder tersebut dengan project-cakephp4.

Pada folder yang dibuat barusan kamu buat kembali folder config yang di dalamnya terdapat file app_local.php. Setelah itu, copy code berikut untuk membuat configurasi database mysql.

'Datasources' => [
     'default' => [
          'host' => '127.0.0.1',
          /*
          * CakePHP will use the default DB port based on the driver selected
          * MySQL on MAMP uses port 8889, MAMP users will want to uncomment
          * the following line and set the port accordingly
          */
          //'port' => 'non_standard_port_number',

          'username' => 'root',
          'password' => 'root',

          'database' => 'cakephp4',
          /*
          * If not using the default 'public' schema with the PostgreSQL driver
          * set it here.
          */
          //'schema' => 'myapp',

          /*
          * You can use a DSN string to set the entire configuration
          */
          'url' => env('DATABASE_URL', null),
     ],

     /*
     * The test connection is used during the test suite.
     */
     'test' => [
          'host' => 'localhost',
          //'port' => 'non_standard_port_number',
          'username' => 'my_app',
          'password' => 'secret',
          'database' => 'test_myapp',
          //'schema' => 'myapp',
          'url' => env('DATABASE_TEST_URL', 'sqlite://127.0.0.1/tests.sqlite'),
     ],
],

Ubah username dan password sesuai dengan sistem Kamu punya.

3. Membuat Model

Kemudian pada folder root project, Kamu buat kembali folder dengan nama src yang di dalamnya terdapat folder Model. Untuk struktur folder Model bisa lihat berikut.

src/Model/Entity/File.php
src/Model/Table/FilesTable.php

Pada folder src/Model/Entity/File.php copy code berikut di file Kamu. Jika Kamu tidak ingin mengizinkan penyisipan dan pembaruan bidang apa pun, bisa set ke false.

<?php
declare(strict_types=1);

namespace App\Model\Entity;

use Cake\ORM\Entity;

/**
* Image Entity
*
* @property int $id
* @property string $filename
* @property string $path
*/
class File extends Entity
{

      protected $_accessible = [
           'filename' => true,
           'path' => true,
      ];
}

Sedangkan pada folder src/Model/Table/FilesTable.php copy code berikut untuk mendefinisikan validasi file dalam metode validationDefault().

<?php
declare(strict_types=1);

namespace App\Model\Table;

use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;

class FilesTable extends Table
{

      public function initialize(array $config): void
      {
            parent::initialize($config);

            $this->setTable('files');
            $this->setDisplayField('id');
            $this->setPrimaryKey('id');
      }

      public function validationDefault(Validator $validator): Validator
      {
            $validator
                 ->scalar('filename')
                 ->maxLength('filename', 255)
                 ->requirePresence('filename', 'create') 
                 ->notEmptyFile('filename');

            $validator
                 ->scalar('path')
                 ->maxLength('path', 255)
                 ->requirePresence('path', 'create')
                 ->notEmptyString('path');

            // File validation
            $validator
                 ->notEmptyFile('fileel')
                 ->add('fileel', [
                       'mimeType' => [
                             'rule' => ['mimeType',['image/jpg','image/png','image/jpeg','application/pdf']],
                             'message' => 'File type must be .jpg,.jpeg,.png,.pdf',
                       ],
                       'fileSize' => [
                             'rule' => ['fileSize','<', '2MB'],
                             'message' => 'File size must be less than 2MB',
                       ]
                 ]);

            return $validator;
      }
}

4. Membuat Controller

  • Buat file FileuploadController.php di folder src/Controller/.
  • Buat kelas FileuploadController yang memperluas AppController.
  • Sertakan App\Model\Entity\File Entity dan untuk membuat folder baru sertakan Cake\Filesystem\Folder.
  • Buat metode index()
    • Membuat instance entitas File.
    • Jika <form> adalah POST maka validasi data POST menggunakan patchEntity().
    • Baca detail elemen file jika divalidasi.
    • Jika $error == 0 maka tetapkan lokasi unggahan di variabel $location dan periksa apakah unggahan ada atau tidak. Jika tidak ada maka buatlah.
    • Unggah berkas dengan memanggil moveTo().
    • Setelah upload, tetapkan jalur upload di $filepath.
    • Sisipkan record baru di tabel files. Di sini, berikan $filename ke nama file dan $filepath ke path.
    • Ambil semua record dari tabel files dan berikan filesList dan file ke template.
<?php
declare(strict_types=1);

namespace App\Controller;
use App\Model\Entity\File;
use Cake\Filesystem\Folder;

class FileuploadController extends AppController
{

      public function index(){

           ## File entity
           $file = new File();

           $files = $this->getTableLocator()->get('Files');

           if ($this->request->is('post')) {

                 // Validate the data
                 $file = $files->patchEntity($file, $this->request->getData());

                 // File is validated
                 if(!isset($file->getErrors()['fileel'])){

                      $attachment = $this->request->getData('fileel');

                      // File details
                      $filename = $attachment->getClientFilename();
                      $type = $attachment->getClientMediaType();
                      $size = $attachment->getSize();
                      $extension = pathinfo($filename, PATHINFO_EXTENSION);
                      $tmpName = $attachment->getStream()->getMetadata('uri');
                      $error = $attachment->getError();

                      if($error == 0){

                            ## Upload location
                            $location = WWW_ROOT . 'uploads' . DS;

                            ## Check upload location exists or not
                            $folder = new Folder();
                            $checkfolder = $folder->inPath($location, true);
                            if(!$checkfolder){ // Not exists
                                  if (!$folder->create($location)) {
                                        $this->Flash->error('File not uploaded.');
                                  }
                            }

                            ## Upload file
                            $targetPath = $location.$filename;
                            $attachment->moveTo($targetPath);

                            ## Uploaded file path
                            $filepath = "/uploads/".$filename;

                            ## Insert a record in 'files' table
                            $insData['filename'] = $filename;
                            $insData['path'] = $filepath;

                            $newfile = $files->newEntity($insData);
                            if ($files->save($newfile)) {
                                  $this->Flash->success('Inserted successfully.');
                            }else{
                                  $this->Flash->error('Record not inserted.');
                            }

                      }else{
                            $this->Flash->error('File not uploaded.');
                      }
                 }

           }
 
           // Fetch all records
           $query = $files->find()->all();
           $filesList = $query->toArray();

           // Pass to template
           $this->set('filesList', $filesList);
           $this->set('file', $file);
      }

}

5. Membuat Tampilan

Buat folder Fileupload baru di dalam folder templates/. Sekarang di dalam folder Fileupload, buatlah file index.php (templates/Fileupload/index.php).

Buat sebuah <form> . Tetapkan action ke fileupload/index. Masukkan $file sebagai parameter pertama dalam create(). Di sini, $file adalah instance entitas yang dioper dari controller.

Menggunakan untuk membuat daftar semua berkas yang tersimpan di dalam tabel berkas. Perulangan pada Array $filesList dan periksa apakah ekstensi.

Jika $extension adalah tipe gambar, maka buatlah elemen gambar untuk ditampilkan, jika tidak, buatlah tautan.

<div class="row">
    <div class="col-6">

         <?php 

         // Upload form
         echo $this->Form->create($uploadfile,array('url'=>['controller' => 'fileupload','action' => 'index'],"enctype" => "multipart/form-data" ));
         echo $this->Form->control('fileel',['label' => 'Select file','type' => 'file','class' => 'form-control','required' => true]);
         echo $this->Form->button('Submit');
         echo $this->Form->end();

         ?>

         <!-- Files list --> 
         <table> 
              <thead> 
                   <tr> 
                        <th>File</th> 
                        <th>Name</th>
                   </tr> 
              </thead> 
              <tbody> 
                   <?php 
                   foreach ($filesList as $file): ?> 
                   <?php 
                         $filename = $file['filename'];
                         $path = $file['path'];

                         $extension = pathinfo($filename, PATHINFO_EXTENSION);

                   ?>
                         <tr> 
                              <td>
                                   <?php
                                   $image_exts = array("jpg","jpeg","png");
                                   if(in_array($extension,$image_exts)){
                                        echo $this->HTML->image($path,['width' => '100px']);
                                   }else{
                                        echo $this->Html->link(
                                             'View file',
                                             $path,
                                             ['target' => '_blank']
                                        );
                                   }
                                   ?> 
                              </td> 
                              <td><?= $file['filename'] ?></td> 
                         </tr> 
                         <?php endforeach; ?> 
              </tbody> 
         </table>

    </div>
</div>

Selamat sekarang kamu bisa upload dan simpan file ke MySQL dengan bantuan CakePHP 4. Jika ada pertanyaan kamu bisa tulis di kolom komentar di bawah ini.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top