CodeIgniter3文件上传do_upload()始终返回default.jpg如何修复
CodeIgniter3 文件上传始终返回default.jpg修复方案
问题触发场景:Debian11 + XAMPP8.1 环境下 CodeIgniter3 框架的文件上传接口,无论是否提交文件、文件是否符合规则,始终返回default.jpg,无法获取实际上传文件名。
核心故障原因排查&修复
1. 表单缺失文件上传必备属性(最高发原因)
现有视图代码只写了file输入框,但是包裹输入框的<form>标签没有加enctype="multipart/form-data"属性,浏览器不会将文件二进制数据提交到后端,do_upload()方法会直接判定无有效上传文件,返回失败。
修复方式:给对应表单标签补充必填属性:
<!-- 必须加enctype属性,method必须为post --> <form method="post" action="你的表单提交地址" enctype="multipart/form-data"> <div class="form-group"> <label for="file">Attachment</label> <input class="form-control-file" type="file" name="file" /> <div class="invalid-feedback"> <?php echo form_error('file') ?> </div> </div> <!-- 其他表单项、提交按钮 --> </form>
2. 上传目录无写入权限
Debian系统下XAMPP默认以daemon用户运行,若./assets/img/report/目录没有给对应用户开放读写权限,上传时文件无法写入磁盘,会直接触发上传失败。
修复方式:在Debian终端执行以下命令,替换路径为你项目的实际路径:
# 进入XAMPP默认站点根目录 cd /opt/lampp/htdocs/你的项目根目录 # 给上传目录设置读写执行权限 chmod -R 755 ./assets/img/report/ # 将目录所有者修改为XAMPP运行用户 chown -R daemon:daemon ./assets/img/report/
3. 后端代码存在语法&逻辑缺陷
原有代码存在两个问题:一是return default.jpg的字符串没有加引号,PHP解析时会尝试查找未定义常量,触发异常;二是如果上传库在之前的逻辑中已经被加载过,直接传config参数加载不会覆盖原有配置,会导致配置不生效。
修复后的上传逻辑代码:
$config['upload_path'] = './assets/img/report/'; $config['allowed_types'] = 'txt|odt|jpg|png|jpeg|pdf|docx'; $config['file_name'] = $this->id; $config['overwrite'] = true; $config['max_size'] = 150000; // 兼容已加载过上传库的场景,重新初始化配置 if (empty($this->upload)) { $this->load->library('upload', $config); } else { $this->upload->initialize($config); } if ($this->upload->do_upload('file')) { return $this->upload->data('file_name'); } else { // 调试时可放开下一行,打印具体上传错误,正式环境注释即可 // echo $this->upload->display_errors();exit; return 'default.jpg'; }
4. PHP上传大小配置限制(大文件上传场景需检查)
当前代码设置单文件最大为150000KB即150MB,如果XAMPP的PHP配置中upload_max_filesize、post_max_size小于该值,会导致大文件上传被拦截。
修复方式:打开XAMPP的php.ini配置文件(默认路径/opt/lampp/etc/php.ini),修改对应配置:
upload_max_filesize = 200M post_max_size = 200M
修改完成后执行/opt/lampp/lampp restart重启XAMPP服务生效。
内容的提问来源于stack exchange,提问作者Tanzeem
相关产品推荐
相关产品推荐

