Laravel 5.5中Storage::delete方法无法正常工作的问题咨询
为什么Laravel 5.5的Storage::delete无法删除文件?
这个问题的核心是Laravel的Storage facade默认的文件系统根目录和你要操作的文件路径不匹配,我来给你拆解清楚:
1. 先搞懂Laravel Storage的默认规则
Laravel的Storage类默认使用的是local磁盘,它的根目录是项目里的storage/app/,而你要删除的文件是放在项目根目录的public/文件夹下,这俩压根不是一个路径,所以Storage::delete自然找不到文件。
你用unlink($image_path)能成功,是因为public_path()直接指向了项目的public目录,路径完全匹配,所以能找到并删除文件。
2. 解决方法分两种,看你的需求选
方法一:直接配置一个指向public目录的磁盘
打开config/filesystems.php,在disks数组里添加一个新的磁盘配置:
'disks' => [ // 保留原来的local、public等配置 'public_root' => [ 'driver' => 'local', 'root' => public_path(), // 直接指向项目的public目录 'visibility' => 'public', ], ]
然后删除文件的时候,指定使用这个磁盘:
use Illuminate\Support\Facades\Storage; $postroute_ori = '/images/120_5.JPG'; // 注意去掉路径开头的斜杠,避免多余层级 Storage::disk('public_root')->delete(ltrim($postroute_ori, '/'));
方法二:遵循Laravel的Storage规范(更推荐)
Laravel推荐把用户上传的文件放在storage/app/public目录下,然后通过php artisan storage:link命令创建一个软链接到public/storage,这样前端就能通过/storage/xxx访问文件。
这种情况下,你删除文件的代码应该写成:
// 假设文件实际存在于 storage/app/public/images/120_5.JPG Storage::delete('public/images/120_5.JPG'); // 或者直接指定public磁盘,写法更简洁 Storage::disk('public')->delete('images/120_5.JPG');
3. 顺便说下你用File::delete失败的原因
你写的File::delete('/images/120_5.JPG')里的路径是系统绝对路径,它会从你的磁盘根目录(比如D:\)去找images/120_5.JPG,而不是项目的public目录,所以要改成:
File::delete(public_path('images/120_5.JPG'));
内容的提问来源于stack exchange,提问作者robspin
相关产品推荐
相关产品推荐

