PHP多文件上传报错:move_uploaded_file无法移动文件(XAMPP)
问题分析与解决方案
嘿,我一眼就揪出问题啦——你的PHP代码里有个低级语法错误,直接导致HTML文件的文件名没被正确读取!
错误根源
看你定义$filepathHTML的这行代码:
$filepathHTML = $pageName . basename($_FILES['pageHTMLUpload'['name']]);
注意这里的$_FILES索引写法错了!应该是$_FILES['pageHTMLUpload']['name'],你少写了一个闭合的方括号,写成了['pageHTMLUpload'['name']]。这种语法错误会让PHP无法正确获取上传HTML文件的原始文件名,basename()拿到的是空字符串,最终$filepathHTML就变成了只有目录路径,没有文件名(比如你输出的C:\xampp\htdocs/var/uploads/pages/Instagram/)。而move_uploaded_file()要求目标路径必须是具体的文件路径,不是目录,这就是为什么HTML文件移动失败,而PHP文件路径正常的原因——PHP文件的索引写法是对的:$_FILES['pagePHPUpload']['name']。
修正后的代码
我帮你把代码修正,还加了一些安全和健壮性的优化:
$dir = getcwd() . '/var/uploads/pages/'; // 对用户输入的页面名称做安全处理,防止路径遍历攻击 $safePageName = basename($_POST['pageName']); // 确保目录路径末尾有分隔符,避免拼接文件名时出错 $pageName = $dir . $safePageName . DIRECTORY_SEPARATOR; if(mkdir($pageName, 0777, true)){ // 修正HTML文件路径的索引错误 $htmlFileName = basename($_FILES['pageHTMLUpload']['name']); $filepathHTML = $pageName . $htmlFileName; $phpFileName = basename($_FILES['pagePHPUpload']['name']); $filepathPHP = $pageName . $phpFileName; // 先检查HTML文件上传是否正常 if($_FILES['pageHTMLUpload']['error'] === UPLOAD_ERR_OK){ if(move_uploaded_file($_FILES['pageHTMLUpload']['tmp_name'], $filepathHTML)){ // 再检查PHP文件上传状态 if($_FILES['pagePHPUpload']['error'] === UPLOAD_ERR_OK){ if(move_uploaded_file($_FILES['pagePHPUpload']['tmp_name'], $filepathPHP)){ $stmt = $conn->prepare("INSERT INTO pages (title, htmlDir, phpDir) VALUES (?,?,?)"); // 这里注意:title应该存页面名称,而不是完整路径?根据你的需求调整 $stmt->bind_param('sss', $safePageName, $filepathHTML, $filepathPHP); $stmt->execute(); echo "页面创建成功!"; } else{ echo "Error -phpUpload"; } } else{ echo "PHP文件上传出错,错误码:" . $_FILES['pagePHPUpload']['error']; } } else{ echo "Error -htmlUpload"; } } else{ echo "HTML文件上传出错,错误码:" . $_FILES['pageHTMLUpload']['error']; } } else{ echo "Error -pagename"; }
额外优化建议
- 安全过滤用户输入:用
basename($_POST['pageName'])过滤页面名称,防止用户输入../../这类恶意路径进行目录遍历攻击。 - 检查上传错误:每次上传前先判断
$_FILES['xxx']['error'] === UPLOAD_ERR_OK,可以更精准地定位上传问题(比如文件过大、临时目录不可写等)。 - 统一目录分隔符:用
DIRECTORY_SEPARATOR代替硬编码的/,让代码在Windows和Linux系统上都能正常运行。 - 避免重复逻辑:你之前的代码里重复写了一次
move_uploaded_file($_FILES['pageHTMLUpload']['tmp_name'], "$filepathHTML"),我已经帮你去掉了重复部分。
内容的提问来源于stack exchange,提问作者Isaac Manzi
相关产品推荐
相关产品推荐

