PHP调用move_uploaded_file()函数无法移动上传文件问题求助
问题排查结论
你的代码有3个核心错误,直接导致文件移动失败:
- 源文件路径参数传错:
move_uploaded_file()的第一个参数必须传入PHP接收上传文件后在服务器临时目录生成的临时文件路径,对应$_FILES数组的键是tmp_name,你当前传入的$_FILES['file']['name']只是用户上传文件的原始文件名(比如test.png),根本不是服务器上的真实文件路径,函数找不到要移动的源文件自然执行失败。 - 目标路径不符合要求:你用反斜杠拼接路径仅在Windows系统下可用,跨Linux/macOS环境会出现路径解析错误;另外你需要提前确认代码同级目录下的
pic文件夹真实存在,PHP不会自动创建不存在的目标目录,同时要保证Web服务(Apache/Nginx/PHP内置服务器)的运行身份对pic目录有写入权限。 - 缺少上传状态前置校验:你没有先判断文件本身是否上传成功,
$_FILES['file']['error']返回值不为0时,说明上传流程本身就出了问题(比如大小超限、临时目录不可写、文件传输中断等),后续移动操作必然失败。
修正后代码
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="POST" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="submit"> </form> <?php if (isset($_FILES['file'])){ // 先校验上传状态,非0即为上传出错 if ($_FILES['file']['error'] !== UPLOAD_ERR_OK) { exit('文件上传失败,错误码:' . $_FILES['file']['error']); } // 读取正确的临时文件路径、原始文件名 $tempPath = $_FILES['file']['tmp_name']; $fileName = $_FILES['file']['name']; // 拼接兼容多系统的目标存储路径 $destDir = __DIR__ . DIRECTORY_SEPARATOR . 'pic'; // 目标目录不存在时自动递归创建,授予读写权限 if (!is_dir($destDir)) { mkdir($destDir, 0755, true); } $destPath = $destDir . DIRECTORY_SEPARATOR . $fileName; // 执行移动操作并输出结果 if (move_uploaded_file($tempPath, $destPath)) { echo '文件上传成功,存储路径:' . $destPath; } else { echo '文件移动失败,请检查目标目录写入权限'; } } ?>
补充说明
如果替换代码后仍有问题,可以直接在判断逻辑开头加var_dump($_FILES['file']);打印整个上传文件数组,对照数组内的键值就能快速定位参数取值、上传状态类的问题。
内容的提问来源于stack exchange,提问作者Steve051199
相关产品推荐
相关产品推荐

