我正在尝试通过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
;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不存在。你能解释一下吗?
答案 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中的工作方式不同了。如果要修改数据,则应使用beforeMarshal
或beforeSave
事件。但是,对于后者,如果上载字段使用与存储文件路径的数据库中的列相同的名称,则会遇到问题,因为这会导致数组被编组为列的类型,很可能是字符串类型: https://github.com/cakephp/cakephp/issues/5998
另见