〜艦長日誌〜

〜好きなことを好きなときに書きます〜

CakePHP3:ファイルのアップロード(ChatGPT)

1.フォームを作成する

まず、ファイルアップロード機能を持つフォームを作成する必要があります。フォームには、ファイルをアップロードするためのinput要素を含める必要があります。フォームの送信先として、ファイルを受信するアクションを指定します。

// フォームの作成
echo $this->Form->create(null, ['type' => 'file']);

// ファイル選択のためのinput要素を作成
echo $this->Form->file('file');

// 送信ボタンを作成
echo $this->Form->button('Upload');

// フォームの終了
echo $this->Form->end();

2.アップロードされたファイルを処理するアクションを作成する

ファイルをアップロードするためのアクションを作成します。このアクションでは、アップロードされたファイルを処理し、保存する必要があります。CakePHP 3では、ファイルアップロードを処理するための機能が提供されているので、それを利用します。

public function upload()
{
    // POSTデータを取得
    $postData = $this->request->getData();

    // アップロードされたファイルを取得
    $file = $postData['file'];

    // ファイルがアップロードされているかチェック
    if ($file['error'] === UPLOAD_ERR_OK) {

        // ファイルの保存先ディレクトリを指定
        $uploadDir = WWW_ROOT . 'uploads/';

        // ファイルの保存名を生成
        $filename = time() . '_' . $file['name'];

        // ファイルを移動
        move_uploaded_file($file['tmp_name'], $uploadDir . $filename);

        // ファイルの保存先をデータベースに保存
        $this->loadModel('Files');
        $entity = $this->Files->newEntity([
            'name' => $file['name'],
            'filename' => $filename,
            'path' => $uploadDir,
        ]);
        $this->Files->save($entity);

        // メッセージを設定
        $this->Flash->success(__('The file has been uploaded.'));

    } else {
        // エラーメッセージを設定
        $this->Flash->error(__('The file could not be uploaded.'));
    }

    // ページをリダイレクト
    return $this->redirect(['action' => 'index']);
}

3.ファイルアップロードを処理するためのモデルを作成する

ファイルをアップロードするためのモデルを作成します。このモデルには、アップロードされたファイルを保存するためのテーブルと、ファイルアップロードのバリデーションルールを定義する必要があります。

namespace App\Model\Table;

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

class FilesTable extends Table
{
    public function initialize(array $config)
    {
        parent::initialize($config);

        // テーブル名を指定
        $this->setTable('files');

        // カラムを指定
        $this->addBehavior('Timestamp');
        $this->setDisplayField('name');
        $this->setPrimaryKey('id');

        // バリデーションルールを定義
        $this->validator()
            ->allowEmptyFile('filename')
            ->add('filename', [
                'validExtension' => [
                    'rule' => ['extension', ['jpg', 'jpeg', 'png', 'gif']],
                    'message' => __('These files extension are allowed: .jpg, .jpeg, .png, .gif.'),
                ],
            ]);
    }
}

4.ファイルアップロードを処理するためのビューを作成する

ファイルアップロードの結果を表示するためのビューを作成します。このビューには、アップロードされたファイルの情報を表示する必要があります。