CakePHP4のメモ
![]() |
13 |
250 views
CakePHP4では、画像やドキュメントファイルのアップロード機能を簡単に実装できます。この記事では、基本的なファイルアップロードの実装手順をステップごとに解説し、セキュリティ面やバリデーションの設定方法も含めて、実用的なファイルアップロード機能の作り方を紹介します。
まず、ファイルの情報を保存するためのテーブルを用意します。今回は、ファイル名とファイルパスを保存するuploads
テーブルを例にします。
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
);
CakePHP4のbake
コマンドで、CRUD用のモデル、コントローラー、ビューを自動生成します。
bin/cake bake all uploads
これで、基本的なCRUD機能が揃ったUploadsController
やビュー、モデルファイルが生成されます。
次に、アップロードしたファイルを保存するための処理をUploadsController
に追加します。
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
に設定し、ファイルアップロードが可能なフォームにしています。
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
ディレクトリに移動します。アップロードしたファイルを一覧表示するための機能をindex
アクションに追加します。
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
を使ってファイルへのリンクを作成し、クリックでダウンロードできるようにしています。アップロード時にファイルのサイズやタイプを確認し、適切なバリデーションを追加します。モデルのvalidationDefault
メソッドで、ファイルのサイズや拡張子を確認するバリデーションを追加します。
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
ルールでファイルサイズの上限を設定します。アップロードしたファイルを削除するための処理を追加します。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_exists
とunlink
関数を使って、サーバー上のファイルも削除しています。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/