You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 12:01:14