macOS Catalina下图片上传至文件夹move_uploaded_file权限报错求助
解决move_uploaded_file权限拒绝问题的排查方案
看起来你遇到的是典型的Web服务器文件写入权限问题,虽然你已经排查过权限,但可能还有几个容易忽略的细节,我帮你梳理下:
一、先确认目标文件夹的真实路径与权限
验证路径是否正确
相对路径files/有时候会因为Web服务器的工作目录和脚本所在目录不一致而出问题,建议在代码里先输出当前工作目录和目标路径:echo "当前脚本目录:" . __DIR__ . "<br>"; echo "当前工作目录:" . getcwd() . "<br>";确认
files/确实在你期望的位置,如果路径不对,改用绝对路径会更可靠,比如:$targetDir = __DIR__ . '/files/'; // __DIR__代表当前PHP脚本所在的绝对目录检查文件夹的所有者与写入权限
在XAMPP的macOS环境下,Web服务器的运行用户通常是_www,你需要确保这个用户对files/文件夹有写入权限:- 打开终端,进入你的项目目录,执行命令查看文件夹权限:
ls -l files/ - 如果所有者不是
_www,修改所有者:sudo chown _www:staff files/ - 同时确保文件夹有足够的写入权限(测试阶段可以先用755,生产环境不建议用777):
chmod 755 files/
- 打开终端,进入你的项目目录,执行命令查看文件夹权限:
二、代码层面的优化与验证
确保目标文件夹存在
有时候可能因为文件夹被误删或者路径错误导致不存在,在移动文件前先判断并创建:if (!is_dir($targetDir)) { mkdir($targetDir, 0755, true); // true表示递归创建父文件夹 }完善错误检测
在执行move_uploaded_file后添加错误判断,能更精准定位问题:if (move_uploaded_file($fileTmp, $targetPath)) { echo "文件上传成功!"; } else { echo "移动失败:" . error_get_last()['message']; }扩展MIME类型判断(可选)
你的代码只判断了image/jpg和image/jpeg,部分旧浏览器上传jpg文件的MIME类型可能是image/pjpeg,可以补充进去:$allowedTypes = ['image/jpg', 'image/jpeg', 'image/pjpeg']; if (!in_array($fileType, $allowedTypes)){ $uploadOk = 0; }
修改后的完整示例代码
<?php if (isset($_FILES['myfile'])){ $file = $_FILES['myfile']; $fileName = $file['name']; $fileSize = $file['size']; $fileTmp = $file['tmp_name']; $fileType = $file['type']; $fileError = $file['error']; $uploadOk = 1; // 使用绝对路径确保准确性 $targetDir = __DIR__ . '/files/'; $newName = 'picture'; // 检查并创建目标文件夹 if (!is_dir($targetDir)) { mkdir($targetDir, 0755, true); } // 允许更多jpg相关的MIME类型 $allowedTypes = ['image/jpg', 'image/jpeg', 'image/pjpeg']; if (!in_array($fileType, $allowedTypes)){ $uploadOk = 0; echo "只允许上传JPG格式图片!"; } if ($fileSize > 5242880){ // 限制5MB以内 $uploadOk = 0; echo "图片大小不能超过5MB!"; } if ($uploadOk == 1){ $ext = pathinfo($fileName, PATHINFO_EXTENSION); $targetPath = $targetDir . $newName . '.' . $ext; // 执行移动并反馈结果 if (move_uploaded_file($fileTmp, $targetPath)) { echo "文件上传成功,路径:" . $targetPath; } else { echo "移动文件失败,错误信息:" . error_get_last()['message']; } } } ?>
先按照上面的步骤排查路径和权限,应该就能解决这个问题了。
内容的提问来源于stack exchange,提问作者dell
相关产品推荐
相关产品推荐

