PHP上传文件移动失败求助:move_uploaded_file报错排查
先看你遇到的错误提示:
C:\Users\Admin\AppData\Local\Temp\php9664.tmp
Warning: move_uploaded_file(/img/collection/usbwebserver.exe): failed to open stream: No such file or directory in D:\Home\Volodya\Projects\Web\CollectionSite\site\php\collection.php on line 26
Warning: move_uploaded_file(): Unable to move 'C:\Users\Admin\AppData\Local\Temp\php9664.tmp' to '/img/collection/usbwebserver.exe' in D:\Home\Volodya\Projects\Web\CollectionSite\site\php\collection.php on line 26
问题根源
你用了/img/collection/作为目标路径,这是系统根目录的绝对路径(Windows里对应C盘根目录),但你的项目实际在D:\Home\Volodya\Projects\Web\CollectionSite\site\下,这个路径根本不存在,所以文件移动失败。
解决方案
1. 使用相对路径(推荐)
你的脚本在site/php/目录下,要访问项目内的site/img/collection/,相对路径应该用../img/collection/(../表示回到上一级目录)。修改文件复制代码:
echo($_FILES['img']['tmp_name']); // 定义相对路径 $targetDir = '../img/collection/'; // 确保目标目录存在,不存在则创建(递归创建多级目录) if (!is_dir($targetDir)) { mkdir($targetDir, 0755, true); } move_uploaded_file($_FILES['img']['tmp_name'], $targetDir . basename($_FILES['img']['name']));
2. 或使用网站根目录的绝对路径
用$_SERVER['DOCUMENT_ROOT']获取网站根目录(即D:\Home\Volodya\Projects\Web\CollectionSite\site\),再拼接目标路径:
echo($_FILES['img']['tmp_name']); $targetDir = $_SERVER['DOCUMENT_ROOT'] . '/img/collection/'; if (!is_dir($targetDir)) { mkdir($targetDir, 0755, true); } move_uploaded_file($_FILES['img']['tmp_name'], $targetDir . basename($_FILES['img']['name']));
3. 额外修正:表单HTML语法问题
你输出<option>标签时,属性值没有正确加引号,会导致HTML语法错误,比如:
// 原来的写法(有语法问题) echo("<option value=".$row['country_id']."">".$row['country_name']."</option>");
改成以下写法,用单引号包裹HTML结构,双引号包裹属性值:
echo('<option value="' . $row['country_id'] . '">' . $row['country_name'] . '</option>');
最后检查
- 确认
img/collection/目录存在,并且PHP进程有写入权限(Windows环境可右键目录,给Users组添加写入权限) - 可以先打印最终目标路径验证正确性:
echo $targetDir . basename($_FILES['img']['name']);
内容的提问来源于stack exchange,提问作者Poseydon

