CakePHP 3.x - 上传文件验证器总是失败

CakePHP 3.x - File validators on upload always failing

我正在上传图片。我正在尝试在模型中进行图像验证(应该这样做,对吧?),但是我无法进行验证。

我在src/Model/Table/CommentTable中输入了以下内容:

   public function validationDefault(Validator $validator)
   {
       //...
       $validator->add('photofile', 'upload', [
           'rule' => ['uploadedFile', ['maxSize' => 1048576, 'optional' => true, 'types' => ['image/*']]],
           'message' => 'Not a valid file'
       ]);

       //...
    }

为了测试我的控制器看起来像(我硬编码了一个现有文件):

    $comment = $this->Comments->newEntity([
        'body' => $data['body'],
        'bin_id' => $bin_id,
        'user_id' => $this->Auth->user('id'),
        'photofile' => 'C:/Users/Robert/Downloads/test.jpg'
    ]);

这个文件只有几个字节,但调试后 $comment 在 'photofile' 中显示错误:

'[errors]' => [
    'photofile' => [
        'upload' => 'Not a valid file'
    ]
],

那么为什么验证器总是失败?我使用正确吗?

好吧,这不是上传的文件,所以这通常是预期的行为。此外,字符串根本不支持作为有效值,该值必须是文件上传数组,或者从 CakePHP 3.4 开始,一个实现 \Psr\Http\Message\UploadedFileInterface.

的对象

对于文件上传数组,CakePHP 提供的 uploadedFile 验证规则将使用 is_uploaded_file(),对于未实际上传的文件将失败,您无法模拟它们。

从 CakePHP 3.4 开始,您可以使用已经提到的 UploadedFileInterface 对象。 CakePHP 需要 \Zend\Diactoros\UploadedFile,它提供了一个可用于测试目的的实现,例如:

$file = 'C:/Users/Robert/Downloads/test.jpg';

$comment = $this->Comments->newEntity([
    'body' => $data['body'],
    'bin_id' => $bin_id,
    'user_id' => $this->Auth->user('id'),
    'photofile' => new \Zend\Diactoros\UploadedFile(
        $file,
        filesize($file),
        \UPLOAD_ERR_OK,
        pathinfo($file, \PATHINFO_BASENAME),
        'image/jpeg'
    )
]);

然而,虽然这将通过验证,但您将无法使用 UploadedFile::moveTo() 移动该文件,因为它再次使用 move_uploaded_file()仅适用于实际上传的文件。

此外,MIME 类型的正则表达式验证仅在作为字符串传递时有效(目前未记录),并且它必须是包括分隔符的有效正则表达式,例如

'types' => '#^image/.+$#'

或者将确切类型指定为数组,即

'types' => ['image/jpeg', 'image/png', /* ... */]

另见