我正在尝试在cakephp版本4上传文件。
我正在跟踪此文档
我试过控制器
if ($this->request->is('post')) {
$image = $this->request->getData('image');
$fileName = $image->getClientFilename();
$targetPath = WWW_ROOT.'img'.DS.$fileName;
$image->moveTo($targetPath);
$user = $this->Users->patchEntity($user, $this->request->getData()); //line 58
$user->image = $fileName;
$this->Users->save($user);
}
图像上传工作正常,名称也保存在数据库中。但当验证错误发生时,我得到
Warning (4096): Object of class Laminas\Diactoros\UploadedFile could not be converted to string [CORE\src\Database\Type\StringType.php, line 97]
原木
Cake\Database\Type\StringType::marshal() - CORE\src\Database\Type\StringType.php, line 97
Cake\ORM\Marshaller::Cake\ORM\{closure}() - CORE\src\ORM\Marshaller.php, line 78
Cake\ORM\Marshaller::merge() - CORE\src\ORM\Marshaller.php, line 558
Cake\ORM\Table::patchEntity() - CORE\src\ORM\Table.php, line 2761
App\Controller\UsersController::add() - APP/Controller\UsersController.php, line 58
Cake\Controller\Controller::invokeAction() - CORE\src\Controller\Controller.php, line 524
Cake\Controller\ControllerFactory::invoke() - CORE\src\Controller\ControllerFactory.php, line 79
Cake\Http\BaseApplication::handle() - CORE\src\Http\BaseApplication.php, line 229
Cake\Http\Runner::handle() - CORE\src\Http\Runner.php, line 77
Cake\Http\Runner::handle() - CORE\src\Http\Runner.php, line 77
Cake\Http\Middleware\CsrfProtectionMiddleware::process() - CORE\src\Http\Middleware\CsrfProtectionMiddleware.php, line 132
Cake\Http\Runner::handle() - CORE\src\Http\Runner.php, line 73
Cake\Http\Runner::run() - CORE\src\Http\Runner.php, line 58
Cake\Routing\Middleware\RoutingMiddleware::process() - CORE\src\Routing\Middleware\RoutingMiddleware.php, line 162
Cake\Http\Runner::handle() - CORE\src\Http\Runner.php, line 73
Cake\Routing\Middleware\AssetMiddleware::process() - CORE\src\Routing\Middleware\AssetMiddleware.php, line 68
2条答案
按热度按时间enxuqcxy1#
首先,您的代码示例盲目地信任客户端,它接受任何文件,并允许通过传递路径作为文件名来选择任意目标位置!切勿在未验证/清理客户端数据的情况下使用客户端数据,信任客户端提供的文件日期可能会导致各种漏洞!!!
也就是说,通常你要么使用一个单独的字段来上传文件,要么使用一个自定义的数据库类型,当数据被编组时,它不会转换数据,这样你就可以在之后手动转换它。目前你似乎使用的上传字段应该在数据库中保存一个字符串,因此编组器会试图将输入转换为字符串,这当然会失败。
例如,将表单控件从
image
重命名为image_file
(数据库中不应存在这样的列),为image_file
添加适当的验证规则,以确保上载有效,即检查类型、大小、名称等:然后处理上传 * 后 * 修补,即验证后发生,只有移动文件,如果验证成功!
一旦掌握了工作原理,就应该考虑将上载处理逻辑移到表类或行为(
beforeSave()
事件/回调在执行上载逻辑方面非常流行)或某种服务中。您可能还想了解一下现有的插件是如何处理上传的,例如,请参见https:github.com/FriendsOfCake/awesome-cakephp#user-content-files
h79rfbju2#