PHP结合AJAX上传文件未存入目录且mkdir无法创建目录问题求助
问题排查与修复方案
1. 核心问题:前后端文件字段名不匹配
前端FormData中上传的文件字段名为authform[],后端代码却从$_FILES['file']中读取文件,字段名完全不匹配,导致后端根本无法获取到上传的文件内容,是存储失败的直接原因。
修复方案可二选一:
- 调整前端代码,将
formData.append( 'authform[]', file)修改为formData.append( 'file', file)(单文件上传不需要数组格式) - 调整后端代码,将所有
$_FILES['file']替换为$_FILES['authform'],多文件场景下需要遍历对应数组处理每个文件。
2. 路径逻辑错误修复
现有代码存在两处路径问题:
- 仅判断并创建了
uploads目录,但实际文件存储路径为downloads/user-files/,未判断该存储目录是否存在 - 全部使用相对路径,PHP相对路径基于入口脚本的工作目录计算,而非当前PHP文件所在目录,极易出现路径定位错误
修复代码示例:
<?php // 用__DIR__获取当前PHP文件所在目录的绝对路径,避免相对路径问题 $uploadDir = __DIR__ . '/downloads/user-files/'; // 第三个参数true表示递归创建多级目录 if (!file_exists($uploadDir)) { $mkdirRes = mkdir($uploadDir, 0777, true); if (!$mkdirRes) { die('目录创建失败:' . error_get_last()['message']); } // 避免系统umask影响权限设置,创建后重新赋权 chmod($uploadDir, 0777); } // 字段名要和前端传的对应,这里假设已经把前端字段改成了file $filename = time()."_".$_FILES['file']['name']; if ($_FILES['file']['error'] > 0) { die('上传错误:' . $_FILES['file']['error']); } $savePath = $uploadDir . $filename; $moveRes = move_uploaded_file($_FILES['file']['tmp_name'], $savePath); if (!$moveRes) { die('文件存储失败:' . error_get_last()['message']); } echo 'downloads/user-files/'.$filename; ?>
3. 权限补充检查
除目标目录本身的权限外,需确认目标目录的所有上级父目录都给apache用户开放了执行(x)权限,否则apache用户无法进入目录层级,同样会导致创建、写入失败。
4. 服务端配置校验
检查php.ini的以下配置项:
file_uploads = On:确认开启文件上传功能upload_max_filesize、post_max_size:确认配置值大于上传的文件大小open_basedir:确认没有限制你要写入的目录路径
内容的提问来源于stack exchange,提问作者Amin
相关产品推荐
相关产品推荐

