例
基本的な例
注意: Upload ビヘイビアは、コアの Translate ビヘイビアより 前に 定義したほうがよいかもしれません。この 2 つは互いに衝突することが知られています。
CREATE table users (
id int(10) unsigned NOT NULL auto_increment,
username varchar(20) NOT NULL,
photo varchar(255)
);class User extends AppModel
{
public $actsAs = [
'Upload.Upload' => [
'photo',
],
];
}<?= $this->Form->create('User', ['type' => 'file']) ?>
<?= $this->Form->input('User.username') ?>
<?= $this->Form->input('User.photo', ['type' => 'file']) ?>
<?= $this->Form->end() ?>上の設定では、アップロードしたファイルを削除できません。削除できるようにするには、次のように ファイルのディレクトリを保存するフィールドを追加する必要があります。
CREATE table users (
`id` int(10) unsigned NOT NULL auto_increment,
`username` varchar(20) NOT NULL,
`photo` varchar(255) DEFAULT NULL,
`photo_dir` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
);class User extends AppModel
{
public $actsAs = [
'Upload.Upload' => [
'photo' => [
'fields' => [
'dir' => 'photo_dir',
],
],
],
];
}上の例では、photo には、フォームの file input によるファイルのアップロード、text input による (URL からの) ファイルの取得、またはコントローラーからプログラムで URL を指定したファイルの取得の いずれも使えます。
ファイルのアップロードの例
<?= $this->Form->create('User', ['type' => 'file']) ?>
<?= $this->Form->input('User.username') ?>
<?= $this->Form->input('User.photo', ['type' => 'file']) ?>
<?= $this->Form->input('User.photo_dir', ['type' => 'hidden']) ?>
<?= $this->Form->end() ?>フォームからのファイルの取得の例
text input にファイルの URL を入力します。
<?= $this->Form->create('User', ['type' => 'file']) ?>
<?= $this->Form->input('User.username') ?>
<?= $this->Form->input('User.photo', ['type' => 'text']) ?>
<?= $this->Form->input('User.photo_dir', ['type' => 'hidden']) ?>
<?= $this->Form->end() ?>フォームを使わずにプログラムでファイルを取得する
$this->User->set(['photo' => $image_url]);
$this->User->save();サムネイルの作成
サムネイルは自動的には作成されません。作成するには、サムネイルのサイズを定義する必要があります。 注意: デフォルトではサムネイルは imagick で生成されます。GD を使いたい場合は thumbnailMethod 属性を 設定する必要があります。例: 'thumbnailMethod' => 'php'。
class User extends AppModel
{
public $actsAs = [
'Upload.Upload' => [
'photo' => [
'thumbnailSizes' => [
'xvga' => '1024x768',
'vga' => '640x480',
'thumb' => '80x80',
],
],
],
];
}ビューでファイルへのリンクを表示する
ファイルをアップロードしたら、パスを指定し、データベースのファイルの情報を使って、HtmlHelper で リンクを作成できます。
この例では、モデル Example で デフォルトのビヘイビアの設定 を使っています。
$exampleData = [
'Example' => [
'image' => 'imageFile.jpg',
'dir' => '7',
],
];
echo $this->Html->link('../files/example/image/' . $exampleData['Example']['dir'] . '/' . $exampleData['Example']['image']);アプリケーションでサムネイルを設定している場合は、ファイル名の前にそのサムネイルの名前を付けるだけです。
echo $this->Html->link('../files/example/image/' . $exampleData['Example']['dir'] . '/thumb_' . $exampleData['Example']['image']);複数のファイルのアップロード
1 つのレコードに複数のファイルを添付することもできます。
class User extends AppModel
{
public $actsAs = [
'Upload.Upload' => [
'resume',
'photo' => [
'fields' => [
'dir' => 'profile_dir',
],
],
],
];
}Upload.Upload の配列の各キーはフィールド名で、それぞれ独自の設定を持つ ことができます。 たとえば、ファイルのパスを保存するフィールドを別々にしたい場合は次のようにします。
class User extends AppModel
{
public $actsAs = [
'Upload.Upload' => [
'resume' => [
'fields' => [
'dir' => 'resume_dir',
'type' => 'resume_type',
'size' => 'resume_size',
],
],
'photo' => [
'fields' => [
'dir' => 'photo_dir',
'type' => 'photo_type',
'size' => 'photo_size',
],
],
],
];
}このプラグインには、リクエストごとにアップロードできるファイルの数の制限はありませんが、 ユーザーが他のリクエストをブロックできてしまう余地を減らすために、数は少なく抑えるべきです。
数がわからない、または多数のアップロードをモデルに追加したい場合は、 ポリモーフィックな添付ファイル を使うことを検討してください。
レコード全体を削除せずに現在のファイルを削除する
モデルのレコード全体を削除せずに、写真やアップロードしたファイルだけを削除したい場合があります。 その場合は次のコードを使います。
echo $this->Form->create('Model', ['type' => 'file']);
echo $this->Form->input('Model.file.remove', ['type' => 'checkbox', 'label' => 'Remove existing file']);2 つのアップロードを別々のフォルダに保存する
複数のファイルをアップロードし、それぞれを別のフォルダに保存したい場合があります。これは実はとても 簡単です。ファイルごとに ビヘイビアの設定を使うだけで、パスを変更できます。 先にプラグインをインストールしておく のを忘れないでください。
この例では、ユーザーの写真と、たとえばそのユーザーの車の写真をアップロードしたいとします。 簡単にするために、これらのファイルは User モデルだけに保存するものとします。
注意: 各フィールドがそれぞれ独自の設定を持てることに注意してください。
// src/Model/User.php (legacy layout: app/Model/User.php)
public $actsAs = [
'Upload.Upload' => [
// The name of the field in our database, so this is `users.avatar`
'avatar' => [
// Here we can define the rootDir, which is the root of the application, usually an absolute path to your project
'rootDir' => ROOT,
// The path pattern that we want to use to save our file where {DS} is the directory separator
// and the {ROOT}, {model} and {field} tokens are replaced with their matching values
'path' => '{ROOT}{DS}webroot{DS}files{DS}{model}{DS}{field}{DS}',
'fields' => [
// It's always helpful to save the directory our files are in, just in case
'dir' => 'image_dir',
],
],
'car' => [
// Here we have changed the path, so our images will now be in a different folder
'path' => '{ROOT}{DS}webroot{DS}files{DS}cars{DS}',
],
],
];アップロード先のパスを動的に変更する
アップロード先のパスを動的に変更する必要がある場合は、モデルでビヘイビアの設定を変更します。 たとえば beforeSave() などのモデルのコールバックの中で行います。
// src/Model/User.php (legacy layout: app/Model/User.php)
$this->Behaviors->Upload->settings['field']['path'] = $newPath;