Laravel 7 线上服务器public文件夹图片无法删除问题咨询
问题结论
这种本地测试正常、线上可正常保存文件但无法删除、且文件路径验证无误的情况,基本属于服务器端权限问题,和代码逻辑无关。
原因说明
上传文件到目录仅需要目标目录具备对应写入权限即可完成操作,而删除文件需要同时满足两个权限要求:
- 待删除的文件本身对Web服务运行用户开放可写权限
- 待删除文件所在的父目录,对Web服务运行用户开放写入+执行权限
线上环境Web服务通常使用独立用户(如www-data、nginx、apache等)运行,和文件/目录的所属用户不一致时,就会出现可读、可上传但无法删除的情况。
排查验证方法
你可以在线上临时运行以下代码确认权限问题:
// 输出目标文件权限 echo "文件权限:".substr(sprintf('%o', fileperms(public_path() . "/assets/img/recipes/" . $recipe_id . "_square.jpg")), -4)."<br>"; // 输出父目录权限 echo "父目录权限:".substr(sprintf('%o', fileperms(public_path() . "/assets/img/recipes/")), -4)."<br>"; // 输出当前PHP运行的用户 echo "PHP运行用户:".get_current_user();
如果输出的文件权限为0644、父目录权限为0755,且PHP运行用户和文件/目录的所属用户不一致,即可完全确认是权限配置问题。
解决方案
1. 临时修复存量文件删除问题
登录线上服务器执行权限修改命令,假设你的Web运行用户为www-data,站点根目录路径为/var/www/your_project,执行以下命令即可:
chown -R www-data:www-data /var/www/your_project/public/assets/img/recipes chmod -R 755 /var/www/your_project/public/assets/img/recipes
2. 永久修复后续新上传文件的删除权限
如果使用的是Laravel框架,可以直接修改文件上传配置,指定默认权限:
- 单次上传时指定权限:
$file->storeAs($save_path, $file_name, [ 'disk' => 'public', 'visibility' => 'public', 'directory_visibility' => 'public' ]);
- 全局配置默认权限:在
config/filesystems.php中找到public磁盘的配置项,添加权限配置:
'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', 'directory_visibility' => 'public', 'throw' => false, ],
内容的提问来源于stack exchange,提问作者Scott87
相关产品推荐
相关产品推荐

