CakePHP 5 上传文件验证总是失败

问题描述 投票:0回答:1

尝试在 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() 验证方法,但仍然收到错误。

php validation cakephp
1个回答
0
投票

问题是我在验证实体之前移动了文件。这导致移动的布尔值更改为 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 看来,这并没有被移动,因此通过了验证。

© www.soinside.com 2019 - 2024. All rights reserved.