cakephp 3图片上传

时间:2015-07-29 18:44:55

标签: php cakephp cakephp-3.0

我正在尝试通过cakephp 3上传图片。我已经尝试了下面的代码在cakephp 2中工作。现在在cakephp 3中我尝试了下面的代码

数据库字段

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

然后在用户add.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 comment之后,我改变了

;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;
    }

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

1 个答案:

答案 0 :(得分:2)

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

<强> http://php.net/manual/en/fileinfo.installation.php

发生其他错误是因为您尚未定义可以找到自定义方法的提供程序。您最有可能将该方法添加到您的表类中,因此在这种情况下您应该使用table提供程序

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

默认提供程序被定义为使用\Cake\Validation\Validation类。

在旁注中,$check不会包含字段名称作为键,验证方法将接收数据中的键所保存的普通值。

$this->data也不再存在,现在3.x中的工作方式不同了。如果要修改数据,则应使用beforeMarshalbeforeSave事件。但是,对于后者,如果上载字段使用与存储文件路径的数据库中的列相同的名称,则会遇到问题,因为这会导致数组被编组为列的类型,很可能是字符串类型: https://github.com/cakephp/cakephp/issues/5998

另见