Windows8.1 XAMPP环境PHP上传文件报Permission denied错误求解
问题根因
- 代码层面存在2个直接错误:
move_uploaded_file方法的第二个参数末尾多了多余空格,会被系统识别为名称带空格的不存在目录,触发路径不合法错误- 仅指定了目标存储目录,没有拼接上传后的文件名,系统无法确定临时文件的存储名称
- 若修复代码后仍报错,需确认目录权限配置是否真的生效
修复方案
第一步:修正上传代码
替换原有move_uploaded_file行代码即可:
// 去掉路径末尾的空格,同时拼接原始文件名作为存储名称 move_uploaded_file($post_image_temp, "../images/" . $post_image);
如果仍存在相对路径识别异常,建议改用绝对路径,适配Windows XAMPP环境的写法如下:
// 拼接网站根目录生成绝对路径,避免相对路径随脚本执行目录变化失效 $target_path = $_SERVER['DOCUMENT_ROOT'] . '/CMS/CMS_TEMPLATE/images/' . $post_image; move_uploaded_file($post_image_temp, $target_path);
第二步:校验目录权限(若代码修复后仍报错)
- 右键点击
images文件夹,选择「属性」→「安全」,给Everyone或者XAMPP运行的Authenticated Users用户组开放「写入」「修改」权限 - 确认文件夹的「只读」属性已取消,点击「应用」后重启XAMPP的Apache服务生效
- 可以用测试脚本验证目录可写性:
<?php $test_file = "../images/write_test.tmp"; $write_status = file_put_contents($test_file, "权限校验"); if($write_status){ echo "目录可写,权限配置正常"; unlink($test_file); }else{ echo "目录不可写,请重新检查权限配置"; }
额外优化建议
为避免后续业务异常,可以补充2个逻辑:
- 上传前判断目标目录是否存在,不存在自动创建:
if(!is_dir("../images")){ mkdir("../images", 0777, true); }
- 对上传文件名做重命名,避免同名文件覆盖:
// 给文件名加唯一前缀,防止覆盖 $post_image = uniqid() . "_" . $_FILES['post_image']['name'];
内容的提问来源于stack exchange,提问作者Miguel David
相关产品推荐
相关产品推荐

