CodeIgniter文件上传异常主因是配置、路径、编码或会话链路中断;须确保enctype="multipart/form-data"、调用display_errors()查错、中文名需mb_convert_encoding转码、数据库操作前确认$db已加载且字段名匹配、上传前验证session有效性。

CodeIgniter 文件上传失败或行为异常,绝大多数情况不是框架“不支持”,而是配置、路径、编码或会话链路中某一个环节断开了。直接改核心类或硬写 move_uploaded_file() 不仅难维护,还容易在升级后失效。
文件上传表单必须带 enctype="multipart/form-data"
这是最常被忽略的底层前提。即使用了 form_open_multipart(),如果手动写了 <form> 标签却漏掉这个属性,$_FILES 就永远为空。
- 检查浏览器开发者工具 Network → Form Data,确认文件字段是否出现在提交数据里
- 若用 AJAX 上传,不能靠
$.post(),必须用FormData构造并设置processData: false和contentType: false - CI 的
form_open_multipart()会自动加该属性,但如果你混用了原生<form>,就得自己补上
$this->upload->do_upload() 返回 false 却没报错?先查 $this->upload->display_errors()
CI 的上传类默认静默失败——do_upload() 返回 false 时,错误信息藏在内部,不调用 display_errors() 就看不到真正原因。
- 永远在
if (!$this->upload->do_upload('userfile'))分支里加一行:echo $this->upload->display_errors();(开发阶段) - 常见真实错误包括:
The upload path does not appear to be valid.(路径不存在或无写权限)、You did not select a file to upload.(name属性名对不上)、File is too large(受php.ini的upload_max_filesize限制) - 注意:CI 的
max_size配置单位是 KB,而 PHP 配置是 MB,别搞混
中文文件名乱码,别改 Upload.php,用控制器层转码更稳
Windows 下 IE/Edge 或旧版 Chrome 提交的中文文件名是 GBK 编码,CI 按 UTF-8 处理会导致 file_exists() 判定失败、保存路径错乱,甚至覆盖同音字文件。
- 在控制器里统一转换源编码:
$orig_name = mb_convert_encoding($_FILES['userfile']['name'], 'UTF-8', 'auto'); - 提取扩展名用
pathinfo($orig_name, PATHINFO_EXTENSION),再拼接安全文件名:uniqid() . '.' . $ext - 这样既避开修改系统库的风险,又保证跨平台兼容;
$config['encrypt_name'] = TRUE也能照常启用
上传成功但数据库没更新?重点盯 $this->db 是否就绪和字段名大小写
文件进了 ./uploads/ 目录,但数据库字段还是空,90% 是模型里 $this->db 未初始化,或字段名与数据库定义不一致。
- 模型构造函数里必须显式加载数据库:
$this->load->database();,否则update()调用不报错也不执行 - Linux 服务器上,
user_image和user_Image是两个字段;用DESCRIBE users;确认实际字段名 - 更新前加日志:
log_message('debug', 'Update SQL: ' . $this->db->last_query());,能立刻暴露是否走到 DB 层
最易被跳过的点:CI 的上传类不校验 session 是否有效,但你的业务逻辑依赖 $this->session->userdata('id')。上传成功却找不到用户 ID,整个更新就会静默跳过——务必在控制器开头验证会话值是否存在且非空。


















