Windowsで始めるCakePHP4

CakePHP4のメモ

13

250 views

概要

CakePHP4では、画像やドキュメントファイルのアップロード機能を簡単に実装できます。この記事では、基本的なファイルアップロードの実装手順をステップごとに解説し、セキュリティ面やバリデーションの設定方法も含めて、実用的なファイルアップロード機能の作り方を紹介します。

ステップ1:テーブルとカラムの準備

まず、ファイルの情報を保存するためのテーブルを用意します。今回は、ファイル名とファイルパスを保存するuploadsテーブルを例にします。

1.1 テーブルの作成

MySQLでuploadsテーブルを作成します。アップロードするファイルの名前やパスを保存するカラムを設けます。

CREATE TABLE uploads (
    id INT AUTO_INCREMENT PRIMARY KEY,
    file_name VARCHAR(255) NOT NULL,
    file_path VARCHAR(255) NOT NULL,
    created DATETIME,
    modified DATETIME
);

ステップ2:モデル・コントローラー・ビューの作成

CakePHP4のbakeコマンドで、CRUD用のモデル、コントローラー、ビューを自動生成します。

bin/cake bake all uploads

これで、基本的なCRUD機能が揃ったUploadsControllerやビュー、モデルファイルが生成されます。

ステップ3:ファイルアップロード機能の実装

次に、アップロードしたファイルを保存するための処理をUploadsControllerに追加します。

3.1 フォームの作成

templates/Uploads/add.phpで、ファイル選択用のフォームフィールドを追加します。

<h1>ファイルのアップロード</h1>
<div class="uploads form">
    <?= $this->Form->create($upload, ['type' => 'file']) ?>
    <fieldset>
        <legend><?= __('Upload a File') ?></legend>
        <?= $this->Form->control('file_name', ['type' => 'file', 'label' => 'ファイルを選択']) ?>
    </fieldset>
    <?= $this->Form->button(__('アップロード')) ?>
    <?= $this->Form->end() ?>
</div>

ここでは、type属性をfileに設定し、ファイルアップロードが可能なフォームにしています。

3.2 コントローラーにアップロード処理を追加

src/Controller/UploadsController.phpにファイルを保存する処理を追加します。

public function add()
{
    $upload = $this->Uploads->newEmptyEntity();
    if ($this->request->is('post')) {
        $file = $this->request->getData('file_name');  // アップロードファイルを取得
        $fileName = time() . '_' . $file->getClientFilename();  // ファイル名をタイムスタンプでユニークに
        $targetPath = WWW_ROOT . 'files' . DS . $fileName;  // 保存先のパスを指定

        // ファイルを保存
        if ($file->getSize() > 0 && $file->moveTo($targetPath)) {
            $upload->file_name = $fileName;
            $upload->file_path = 'files/' . $fileName;

            if ($this->Uploads->save($upload)) {
                $this->Flash->success(__('ファイルが正常にアップロードされました。'));
                return $this->redirect(['action' => 'index']);
            }
            $this->Flash->error(__('ファイルを保存できませんでした。再度お試しください。'));
        } else {
            $this->Flash->error(__('ファイルのアップロードに失敗しました。'));
        }
    }
    $this->set(compact('upload'));
}
  • getClientFilename()でアップロードファイル名を取得し、time()でタイムスタンプを付けてファイル名が重複しないようにしています。
  • moveTo()メソッドでファイルをfilesディレクトリに移動します。
  • データベースには、ファイルの名前とパスを保存しています。

ステップ4:ファイル表示機能の追加

アップロードしたファイルを一覧表示するための機能をindexアクションに追加します。

4.1 ファイル一覧表示のためのビュー編集

templates/Uploads/index.phpを編集して、ファイルリンクを表示するようにします。

<h1>アップロードファイル一覧</h1>
<table>
    <tr>
        <th>ID</th>
        <th>ファイル名</th>
        <th>ファイル</th>
        <th>作成日</th>
    </tr>
    <?php foreach ($uploads as $upload): ?>
    <tr>
        <td><?= h($upload->id) ?></td>
        <td><?= h($upload->file_name) ?></td>
        <td><?= $this->Html->link('ダウンロード', '/' . h($upload->file_path), ['target' => '_blank']) ?></td>
        <td><?= h($upload->created) ?></td>
    </tr>
    <?php endforeach; ?>
</table>
  • file_pathを使ってファイルへのリンクを作成し、クリックでダウンロードできるようにしています。

ステップ5:ファイルのバリデーション設定

アップロード時にファイルのサイズやタイプを確認し、適切なバリデーションを追加します。モデルのvalidationDefaultメソッドで、ファイルのサイズや拡張子を確認するバリデーションを追加します。

5.1 ファイルサイズとタイプのバリデーション

src/Model/Table/UploadsTable.phpに以下のバリデーション設定を追加します。

public function validationDefault(Validator $validator): Validator
{
    $validator
        ->add('file_name', 'file', [
            'rule' => ['mimeType', ['image/jpeg', 'image/png', 'application/pdf']],
            'message' => 'JPEG、PNG、またはPDF形式のみが許可されています。'
        ])
        ->add('file_name', 'fileSize', [
            'rule' => ['fileSize', '<=', '5MB'],
            'message' => 'ファイルサイズは5MB以内である必要があります。'
        ]);

    return $validator;
}
  • mimeTypeルールで許可するファイル形式を設定します。
  • fileSizeルールでファイルサイズの上限を設定します。

ステップ6:ファイルの削除機能

アップロードしたファイルを削除するための処理を追加します。deleteアクションで、ファイル自体とデータベースのレコードを削除します。

public function delete($id = null)
{
    $this->request->allowMethod(['post', 'delete']);
    $upload = $this->Uploads->get($id);

    // ファイル削除
    $filePath = WWW_ROOT . $upload->file_path;
    if (file_exists($filePath)) {
        unlink($filePath);
    }

    if ($this->Uploads->delete($upload)) {
        $this->Flash->success(__('ファイルが削除されました。'));
    } else {
        $this->Flash->error(__('ファイルの削除に失敗しました。'));
    }

    return $this->redirect(['action' => 'index']);
}
  • file_existsunlink関数を使って、サーバー上のファイルも削除しています。

まとめ

CakePHP4を使うと、画像やドキュメントなどのファイルアップロード機能を簡単に実装できます。今回紹介した手順で、ファイルのアップロード・表示・削除といった基本機能を備えたアプリケーションが構築できました。ぜひ試して、さらに便利な機能を追加してみてください。

Page 23 of 34.

前のページ 次のページ



[添付ファイル]

1.php_xdebug-3.0.4-8.0-vs16-x86_64.dll  


お問い合わせ

プロフィール

すぺぺぺ

自己紹介

本サイトの作成者。
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
ChatGPTで自動プログラム作成に取り組み中。

サイト/ブログ

https://www.osumoi-stdio.com/novel/

ツイッター

@darkimpact0626