upload_max_filesize post_max_sizeエラーの対策 CakePHP

PHPで大きなファイルをアップロードした時のエラーの原因

  • post_max_size
  • upload_max_filesize

このエラーによる問題

  • CakePHPで空のデータがインサートされる
    メソッドはポストなんだけどポストされたデータが全て空に。
    nameが空なのでvalidateも機能せず、createdとmodifiedだけ追加されインサートされる。
  • ポストされたデータが空になるので$_FILE['xxx']['size']でファイルサイズが取れない

post_max_sizeの対策

ポストしたデータのヘッダのContent-Lengthからポストされたサイズが分かるのでこれをチェックする。 f:id:watuu:20130912214516p:plain

if ($this->request->is('post')) {
    if ($_SERVER['CONTENT_LENGTH'] > (8*1024*1024)) {
        $this->Session->setFlash('アップロードサイズが上限を超えています。');
        $this->Session->write('tmp_data', $this->request->data);
        $this->redirect($this->referer());
    }
} elseif ($this->Session->read('tmp_data')) {
    $this->request->data = $this->Session->read('tmp_data');
    $this->Session->delete('tmp_data');
}

サイズチェックした後、元のページへリダイレクトしたら元のデータが消えてたのでセッションを使ってデータを渡した。
こんなやり方でいいのかな。。。

upload_max_filesizeの対策

MAX_FILE_SIZEを使えば、サイズオーバーなら$_FILE['xxx']['error']に2が返ってくる。

<input type="hidden" name="MAX_FILE_SIZE" value="2097152">

さらにvalidateの方でもファイルチェックを行う必要あり。