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', /* ... */]
另见
我正在上传图片。我正在尝试在模型中进行图像验证(应该这样做,对吧?),但是我无法进行验证。
我在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', /* ... */]
另见