CakePHP1.2でお手軽なファイルアップロード

CakePHP1.2でお手軽なファイルアップロードってことで。
Componentを使ってやってみる。

[php] class UpfileComponent extends Object {

var $dir = null; var $path = null;

function construct() { parent::construct(); $this->dir = Configure::read('Upfile.dir'); }

function files() { $dir = strtolower($this->dir . DS . $this->path); if (!is_dir($dir)) { return array(); } $dir .= DS; $dh = opendir($dir); $files = array(); while*1 !== false) { if (is_file($dir.$file)) { $files[] = basename($file); } } closedir($dh);

return $files;

}

function store() { $dir = strtolower($this->dir . DS . $this->path) ; if (!is_dir($dir)) { mkdir($dir, 0777, true); } $dir .= DS; $i = 1; $ymd = date('YmdHis'); foreach ($_FILES as $k=>$v) { if (!isset($v['tmp_name'])) { contnue; } $tmpname = $v['tmp_name']; $info = pathinfo($v['name']); $ext = strtolower($info['extension']); $newfile = sprintf("%s%s%02d.%s", $dir, $ymd, $i++, $ext); move_uploaded_file($tmpname, $newfile); chmod($newfile, 0666); } return; } }[/php]

使い方としては、
config/core.php とかで、
Configure::write('Upfile.dir', '/var/www/html/upfiles'); とかしておいて、

[php] <?php echo $form->create('Hoge',array('type'=>'file'));?> <?php echo $form->file(null, array('name'=>'test1')); ?> <?php echo $form->file(null, array('name'=>'test2')); ?> [/php]
みたいな感じで View のフォームにfileフィールドを作っておいて、

[php] class HogesController extends AppControler { function edit($id) { $this->path = $this->name . DS . $id; $this->Upfile->store(); } }[/php]
ってな感じで実行すればいいのかと。

あと、画像を取得したい場合は、
[php] function view($id) { $this->Upfile = $this->name . DS . $id; $this->set('upfiles', $this->Upfile->files()); } [/php]
で、いいかと思う。

コンシューマ向け機能であればもっと厳密なチェックだったり削除を入れたほうがいいのだけど、
管理者向け機能で画像の削除もあまり発生しないのであれば、この程度でいいのかも。

ってか、おそらく CakePHP1.2の標準機能でアップロードファイルを扱う「何か」があるハズなんだが。

*1:$file = readdir($dh