cakephp 3图片上传

7hiiyaii  于 2022-11-12  发布在  PHP
关注(0)|答案(1)|浏览(180)

我正在尝试通过cakephp 3上传图片。我已经尝试了下面的代码,这是在cakephp 2工作。现在在cakephp 3我已经尝试了下面的代码
数据库字段

ALTER TABLE `users` ADD `avatar` VARCHAR(255) NOT NULL ;

然后在用户添加.ctp我已经创建了下面的表单

<?= $this->Form->create($user,['type' => 'file']) ?>
<?= $this->Form->input('avatar',['type' => 'file']);?> 
<?= $this->Form->button(__('Submit')) ?>
<?= $this->Form->end() ?>

在用户模型中,我添加了此验证

$validator
            ->add('avatar', [

                'uploadError' => [
                        'rule' => 'uploadError',
                        'message' => 'The cover image upload failed.',
                        'allowEmpty' => TRUE,
                ],

                'mimeType' => [
                        'rule' => array('mimeType', array('image/gif', 'image/png', 'image/jpg', 'image/jpeg')),
                        'message' => 'Please only upload images (gif, png, jpg).',
                        'allowEmpty' => TRUE,
                ],

                'fileSize' => [
                        'rule' => array('fileSize', '<=', '1MB'),
                        'message' => 'Cover image must be less than 1MB.',
                        'allowEmpty' => TRUE,
                ],

                'processCoverUpload' => [
                        'rule' => 'processCoverUpload',
                        'message' => 'Unable to process cover image upload.',
                        'allowEmpty' => TRUE,
                ],

            ]);

之后我发现了这个错误

ext/fileinfo is required for validating file mime types

ndm的评论之后,我已经改变了

;extension=php_fileinfo.dll

extension=php_fileinfo.dll

在php.ini文件中
那么这个错误已经消失了。但是我发现的新错误

error : Method processCoverUpload does not exist

但在下面的方法中我添加了

public function processCoverUpload($check = array()) {
            if (!is_uploaded_file($check['avatar']['tmp_name'])) {
                return FALSE;
            }
            if (!move_uploaded_file($check['avatar']['tmp_name'], WWW_ROOT . 'img' . DS . 'uploads' . DS . $check['avatar']['name'])) {
                return FALSE;
            }
            $this->data[$this->alias]['avatar'] = 'uploads/'. $check['avatar']['name'];
            return TRUE;
    }

我不知道为什么方法processCoverUpload不存在。你能解释一下吗?

k5hmc34c

k5hmc34c1#

正如在注解中已经提到的,CakePHP 3.x现在需要fileinfo扩展来验证mime类型。


发生另一个错误的原因是,您没有定义一个提供程序,在其中可以找到您的自定义方法。

'processCoverUpload' => [
        'provider' => 'table', // <<<< there you go
        'rule' => 'processCoverUpload',
        'message' => 'Unable to process cover image upload.',
        'allowEmpty' => TRUE,
],

默认提供程序定义为使用\Cake\Validation\Validation类。
顺便说一句,$check不会包含字段名作为键,验证方法将接收数据中的键所包含的普通值。
$this->data也不存在了,现在在Python 3.x中工作方式不同了。如果你想修改数据,那么你应该使用**beforeMarshalbeforeSave事件。但是,使用后者你会遇到问题,如果上传字段使用的名称与数据库中存储文件路径的列相同,因为这将导致数组被封送处理为列的类型,该类型很可能是字符串类型:****
另请参阅

*操作手册〉数据库访问和ORM〉验证〉验证提供程序
*Cookbook〉验证〉添加验证提供程序
*Cookbook〉... ORM〉保存数据〉在构建实体之前修改请求数据

相关问题