PHP实现图片上传功能触发move_uploaded_file报错如何解决
问题原因
本次报错核心是move_uploaded_file函数无法找到目标存储目录,和php.ini中已开启的file_uploads配置无关。
解决方案
- 确认并创建目标存储目录
你代码中定义的目标路径是相对路径image/promotions/,该路径是相对于当前执行的upload.php所在目录(即W:\xampp\htdocs\elkssar\functions\)解析的,你需要先确认该目录下是否存在image/promotions层级目录,不存在的话手动创建即可。也可以在代码中加入自动创建目录的逻辑:
// 定义完目标目录后加入以下代码 if (!is_dir($target_dir)) { // 第三个参数true表示递归创建多级目录,Linux环境下权限设为0755即可,Windows环境可忽略权限参数 mkdir($target_dir, 0755, true); }
- 替换为绝对路径避免解析误差
相对路径容易因为脚本执行位置变化出现解析错误,建议使用站点根目录拼接绝对路径,示例:
// 替换原来的$target_dir定义即可,路径根据你实际站点目录结构调整 $target_dir = $_SERVER['DOCUMENT_ROOT'] . '/elkssar/image/promotions/';
- 检查目录读写权限
Windows系统下给image/promotions目录开放Everyone的读写权限,Linux系统下执行权限设置命令chmod -R 755 你的image/promotions目录实际路径即可。
修正后的完整代码
<?php // 改为绝对路径,避免相对路径解析错误 $target_dir = $_SERVER['DOCUMENT_ROOT'] . '/elkssar/image/promotions/'; // 自动创建目录,不存在则生成 if (!is_dir($target_dir)) { mkdir($target_dir, 0755, true); } $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); $uploadOk = 1; $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION)); // 校验是否为真实图片 if(isset($_POST["upload"])) { $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]); if($check !== false) { echo "文件为图片类型 - " . $check["mime"] . "."; $uploadOk = 1; } else { echo "文件不是图片类型。"; $uploadOk = 0; } } // 校验文件是否已存在 if (file_exists($target_file)) { echo "抱歉,文件已存在。"; $uploadOk = 0; } // 校验文件大小 if ($_FILES["fileToUpload"]["size"] > 500000) { echo "抱歉,文件过大。"; $uploadOk = 0; } // 校验文件格式 if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" ) { echo "抱歉,仅支持JPG、JPEG、PNG、GIF格式文件。"; $uploadOk = 0; } // 校验不通过则终止上传 if ($uploadOk == 0) { echo "抱歉,文件上传失败。"; // 所有校验通过则执行上传 } else { if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) { echo "文件". htmlspecialchars( basename( $_FILES["fileToUpload"]["name"])). "上传成功。"; } else { echo "抱歉,上传文件时出现错误。"; } } ?>
内容的提问来源于stack exchange,提问作者Oussama Chaieb
相关产品推荐
相关产品推荐

