mkdir()报invalid path错误主因是sess_save_path配置非法,须设绝对路径如fcpath.'writable/sessions'并确保父目录存在、属主正确、权限为0700。

mkdir() 报 Invalid path 错误,大概率是 sess_save_path 配置不对
这个错误常被误判为权限问题,实际是 CodeIgniter 3 的 Session_files_driver 在初始化时调用 mkdir(),但传入了非法路径。常见错误配置包括:$config['sess_save_path'] 为空、NULL、相对路径(如 './sessions')或未定义。
必须用绝对路径,且父目录需已存在:
-
$config['sess_save_path'] = FCPATH . 'writable/sessions';(推荐,FCPATH指向 Web 根目录) - 手动创建目录:
mkdir -p /var/www/html/writable/sessions - 设属主:
chown www-data:www-data /var/www/html/writable/sessions(Apache 下通常是www-data,Nginx+PHP-FPM 下可能是www-data或nginx) - 权限设为
0700(注意:不是字符串'700',否则 PHP 当作十进制解析成 01254 → 实际权限为 0755)
上传失败提示 “You did not select a file to upload”
这通常不是权限问题,而是表单或调用不匹配:
- 默认文件域名是
userfile,HTML 中必须写成<input type="file" name="userfile"> - 如果改了名字(比如
name="avatar"),调用时要显式传参:$this->upload->do_upload('avatar') - 表单必须用
form_open_multipart(),否则不会带enctype="multipart/form-data",PHP 根本收不到文件数据 - 检查
$_FILES是否为空 —— 如果为空,问题一定出在前端表单或浏览器提交环节
上传后报 “A problem was encountered while attempting to move the uploaded file”
这是典型的目录写入权限失败,但修复方式有讲究:
- 先确认目标目录存在:
is_dir($config['upload_path'])返回false?那就得先mkdir() -
mkdir($cache_path, 0777)才对 —— 注意是数字0777,不是字符串'777'(后者会被当十进制 777 解析,权限变成 01411 → 实际是 0755) - 生产环境别用
chmod -R 777,应设属主:chown -R www-data:www-data uploads/,再设权限:chmod -R 755 uploads/(目录 755,文件自动 644) - 确保
upload_path是相对于 CI 项目根目录的路径(如./uploads/),且 Web 服务器用户对该路径有写权限
上传成功但提示 “the filetype you are attempting to upload is not allowed”
这个错误和权限无关,纯属类型校验失败:
- CI3 默认用 MIME 类型检测,不是只看后缀;某些服务器没装
fileinfo扩展,导致所有类型都被拒 - 检查
php.ini是否启用:extension=fileinfo(重启 PHP 后生效) -
$config['allowed_types'] = 'jpg|png|gif'写法没问题,但若服务器 MIME 映射不准,可临时改成'*'快速验证是否是 MIME 问题 - 注意大小写:有些服务器返回
image/jpeg,而你配置的是jpeg,CI3 默认严格匹配,建议统一用小写并加jpg|jpeg
$_FILES['userfile']['error'] 的值比任何日志都直接 —— 它是 PHP 原生上传状态码,0 表示成功,1–8 对应不同失败原因(如 1=upload_max_filesize 超限,2=post_max_size 超限,3=部分上传,7=无法写入磁盘)。别绕开它去猜。











