CodeIgniter 中没有全局函数 do_upload():CI3 需调用 $this->upload->do_upload() 方法,须先加载 upload 类并配置;CI4 已移除该方法,改用 $this->request->getFile()->moveTo() 处理上传。

do_upload 不是 CodeIgniter 的全局函数,它根本不存在于任何官方版本中——这是个常见误传,多半混进了自定义封装或过时的第三方扩展。
CodeIgniter 3 的上传功能靠 upload 类,不是函数
CI3 没有 do_upload() 这个函数,真正干活的是 $this->upload->do_upload(),它是 Upload 类的一个方法,必须先加载类、配置参数,再调用。直接写 do_upload('file') 会报 Fatal error: Call to undefined function do_upload()。
- 必须先
$this->load->library('upload', $config),否则$this->upload根本不存在 -
do_upload()的参数是表单字段名(如'userfile'或自定义的'avatar'),不是文件路径 - 返回
TRUE或FALSE,错误信息得用$this->upload->display_errors()拿,不是抛异常
CI4 里连 do_upload() 都没了,改用 File 和 Validation
CI4 彻底重构了文件处理逻辑:Upload 类被移除,do_upload() 无对应替代函数。上传靠 $this->request->getFile() 获取 CodeIgniter\HTTP\File 实例,再调用 moveTo()。
-
$file = $this->request->getFile('photo')—— 字段名必须匹配 HTML 的name -
$file->isValid()和$file->hasMoved()必须检查,否则可能上传空文件或重复移动 - 移动前要确保目标目录存在且可写,
moveTo(WRITEPATH . 'uploads/')比硬写./uploads/更安全 - 大小、类型校验不再由上传组件自动做,得走
Validation规则或手动调$file->getSize()/$file->getMimeType()
“上传失败但没报错”?大概率是 upload_path 权限或 PHP 配置问题
CI3 中 do_upload() 返回 FALSE 却不显示具体原因,90% 是因为 upload_path 配置错误或权限不足,而不是代码逻辑问题。
-
upload_path必须是服务器上的绝对路径(如WRITEPATH . 'uploads/'),相对路径(如./uploads)在 CLI 或某些 Apache 配置下会静默失败 - 确认该目录存在、Web 用户(如
www-data)有写权限,且磁盘未满 - 检查
php.ini:如果upload_max_filesize或post_max_size小于上传文件,CI 层根本收不到数据,do_upload()直接返回FALSE,且display_errors()也为空 - CI4 同理,
$file->getError()会返回UPLOAD_ERR_NO_FILE或UPLOAD_ERR_CANT_WRITE,比 CI3 更明确
真正卡住人的从来不是怎么写那几行代码,而是上传路径拼错一个斜杠、PHP 限制没调、或者把 CI4 当 CI3 用还硬找 do_upload —— 这些地方不打日志、不查 getError()、不看 PHP 错误报告,就只能干瞪眼。









