我正在尝试通过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不存在。你能解释一下吗?
1条答案
按热度按时间k5hmc34c1#
正如在注解中已经提到的,CakePHP 3.x现在需要fileinfo扩展来验证mime类型。
发生另一个错误的原因是,您没有定义一个提供程序,在其中可以找到您的自定义方法。
默认提供程序定义为使用
\Cake\Validation\Validation
类。顺便说一句,
$check
不会包含字段名作为键,验证方法将接收数据中的键所包含的普通值。$this->data
也不存在了,现在在Python 3.x中工作方式不同了。如果你想修改数据,那么你应该使用**beforeMarshal
或beforeSave
事件。但是,使用后者你会遇到问题,如果上传字段使用的名称与数据库中存储文件路径的列相同,因为这将导致数组被封送处理为列的类型,该类型很可能是字符串类型:****另请参阅
*操作手册〉数据库访问和ORM〉验证〉验证提供程序
*Cookbook〉验证〉添加验证提供程序
*Cookbook〉... ORM〉保存数据〉在构建实体之前修改请求数据