Laravel 5.8删除存储目录图片失败,求问题排查与解决方法
Laravel 5.8 无法删除存储目录图片的问题排查与解决
问题描述
我正在使用Laravel 5.8,需要删除存储目录中的图片,图片存放路径为:
/storage/app/public/laboratories/labs/21/pics
我尝试运行以下方法,但文件并未从存储中删除:
public function removeAzPic($lab,$azpic) { $destinationPath = storage_path("laboratories/labs/$lab/pics/$azpic"); Storage::delete($destinationPath); return redirect()->back(); }
问题原因
- 路径拼接错误:
storage_path()返回的是项目根目录下storage文件夹的绝对路径(例如/var/www/html/storage),拼接后得到的路径是/var/www/html/storage/laboratories/labs/...,但实际文件存放在/var/www/html/storage/app/public/laboratories/labs/...,缺失了app/public层级。 - Storage facade的路径规则:
Storage::delete()要求传入的是相对于磁盘根目录的相对路径,而非绝对路径。默认local磁盘的根目录是storage/app,直接传入绝对路径会导致文件查找失败。
解决办法
方式一:使用相对路径结合默认磁盘
修改代码,传入相对于storage/app的路径:
public function removeAzPic($lab,$azpic) { // 相对于 storage/app 的路径 $filePath = "public/laboratories/labs/$lab/pics/$azpic"; // 先判断文件是否存在,避免无效操作 if (Storage::exists($filePath)) { Storage::delete($filePath); } return redirect()->back(); }
方式二:直接使用public磁盘
Laravel默认配置了public磁盘,根目录为storage/app/public,可以直接指定磁盘操作:
public function removeAzPic($lab,$azpic) { // 相对于 storage/app/public 的路径 $filePath = "laboratories/labs/$lab/pics/$azpic"; if (Storage::disk('public')->exists($filePath)) { Storage::disk('public')->delete($filePath); } return redirect()->back(); }
备选方案:使用PHP原生函数(不推荐)
如果需要用绝对路径删除文件,可以直接调用PHP的unlink(),但建议遵循Laravel文件系统规范:
public function removeAzPic($lab,$azpic) { $absolutePath = storage_path("app/public/laboratories/labs/$lab/pics/$azpic"); if (file_exists($absolutePath)) { unlink($absolutePath); } return redirect()->back(); }
内容的提问来源于stack exchange,提问作者Pouya Vaghefi
相关产品推荐
相关产品推荐

