CakePHP、BLOBで追加するファイルにバリデーションをかける

今回は前回の記事でBLOBなカラムにファイルのバイナリを追加する方法を紹介したので、保存時にValidationをかける方法を追加したいと思います。

Validationをかける項目としては以下です。

  • ファイルサイズ5MB以下
  • ファイルタイプPDF

PDFを追加するコントローラは以下のようにします。

public function add(){
    $postData = $this->request->getData();
    if(!empty($postData['pdf']['tmp_name'])){
        $upFiles = $this->request->getUploadedFiles();
        $data = [
            'file' => $upFiles['pdf']->getStream(),
            'file_name' => $upFiles['pdf']->getClientFileName(),
            'file_type' => $upFiles['pdf']->getClientMediaType(),
            'file_size' => $upFiles['pdf']->getSize(),
        ];
        $documents = $this->Documents->newEntity($data); // ここでValidation
        $this->Documents->save($documents);
    }
}

ここで、DocumentsTable.phpにおいて、以下のようにValidatorを更新します。

    $validator
        ->add(
            'file_type',
            'file_validity',
            [
                'rule' => function($value, $context){
                    return $value == 'application/pdf';
                },
                'message' => 'アップロードできるファイルの形式はPDFのみです',

        ->add(
            'file_size',
            'file_validity',
            [
                'rule' => function($value, $context){
                    return $value <= 5 * 1024 * 1024;
                },
                'message' => "アップロードできるファイルの上限は5MBまでです"
            ]
        );

これでValidationがかかるはずです。 PopplerPhpなどを活用するとpdfのページ数や用紙の種類(A4とか)でもValidationがかけられるようになります。