尝试在 CakePHP 5 中验证上传的文件
$validator
->notEmptyFile('thumbnail_upload', 'an image is required')
->requirePresence('thumbnail_upload', 'create')
->add('thumbnail_upload', [
'mimeType' => [
'rule' => [
'mimeType', [
'image/jpeg',
'image/png',
'image/jpg'
],
],
'message' => 'File type must be either .jpg, .jpeg or .png'
],
]);
虽然相关文件有效,但验证器中的这一步总是失败。据我所知,\Laminas\Diactoros\UploadedFile 或其他任何内容都没有错误,这是我可以告诉验证器的。 这是文件上传表单输入
<?= $this->Form->control('image_upload', [
'type' => 'file',
'accept' => 'image/jpeg, image/jpg, image/png'
]) ?>
完全卡住了,不知道为什么,我尝试使用 uploadedFile() 验证方法,但仍然收到错误。
问题是我在验证实体之前移动了文件。这导致移动的布尔值更改为 true,从而导致失败。注释掉的代码是我最初拥有它的地方,补丁下面是它需要的地方。
// if ($imageFile->getError() === 0) {
// $imageFile->moveTo(WWW_ROOT . "img/articles/" . $datetime->format('Y-m-d-H-i-s') . '-' . $imageFile->getClientFilename());
// $data['image'] = 'articles/' . $datetime->format('Y-m-d-H-i-s') . $imageFile->getClientFilename();
// }
// if ($thumbnailFile->getError() === 0) {
// $thumbnailFile->moveTo(WWW_ROOT . "img/articles/" . $datetime->format('Y-m-d-H-i-s') . '-' . $thumbnailFile->getClientFilename());
// $data['thumbnail'] = 'articles/' . $datetime->format('Y-m-d-H-i-s') . $thumbnailFile->getClientFilename();
// }
$data['thumbnail'] = 'articles/' . $datetime->format('Y-m-d-H-i-s') . $thumbnailFile->getClientFilename();
$data['image'] = 'articles/' . $datetime->format('Y-m-d-H-i-s') . $imageFile->getClientFilename();
$article = $this->Articles->patchEntity($article, $data, [
'contain' => ['ArticlesCategories']
]);
if ($article->hasErrors(true) === false) {
if ($imageFile->getError() === 0) {
$imageFile->moveTo(WWW_ROOT . "img/articles/" . $datetime->format('Y-m-d-H-i-s') . '-' . $imageFile->getClientFilename());
}
if ($thumbnailFile->getError() === 0) {
$thumbnailFile->moveTo(WWW_ROOT . "img/articles/" . $datetime->format('Y-m-d-H-i-s') . '-' . $thumbnailFile->getClientFilename());
}
}
我最初很困惑,因为我在其他地方有一个几乎相同的东西,但是那是将东西上传到 S3 存储桶,所以在 Laminas\Diactos\UploadedFile 看来,这并没有被移动,因此通过了验证。