Laravel 5.6使用Storage::download报错FileNotFoundException求助
解决Laravel 5.6中Storage::download抛出FileNotFoundException的问题
嘿,我来帮你搞定这个问题!你遇到的FileNotFoundException核心原因是:Storage::download()需要的是对应文件系统磁盘内的相对路径,而不是物理绝对路径或者HTTP URL。咱们先拆解你之前写法的问题,再给你正确的实现方式:
为什么你的两种写法都失效了?
- 第一种写法用
storage_path()."/app/public/".$file->path:这是文件的物理绝对路径,但Storagefacade的方法是基于Laravel的文件系统配置工作的,它期待接收的是相对于磁盘根目录的相对路径,不是直接的物理路径。 - 第二种写法用
asset('storage/'.$file->path):这是生成的前端访问用的HTTP URL,Storage类是用来操作本地/远程文件系统的,完全无法识别URL格式的路径,肯定会找不到文件。
正确的代码实现
你上传文件时用的是'public'磁盘($file->store('posts', 'public')),数据库里存的$file->path刚好就是这个磁盘下的相对路径(比如posts/p4NbvgcxHFcT10TwbS2UUJrajifPcqpN3i7iSyyk.png),所以直接这么写就行:
public function downloadFile($id){ $file = File::find($id); // 指定public磁盘,直接传入数据库存储的相对路径 return Storage::disk('public')->download($file->path, $file->original_name); }
要是你在config/filesystems.php里把默认磁盘(default项)设成了public,还能简化成:
return Storage::download($file->path, $file->original_name);
原理补充
Laravel默认的public磁盘配置中,root指向storage/app/public,你创建的符号链接让public/storage和这个目录关联起来,所以前端能通过asset('/storage/'.$file->path)访问。而Storage::disk('public')会自动基于storage/app/public这个根目录去查找文件,所以直接传数据库里的相对路径就完全够用啦。
内容的提问来源于stack exchange,提问作者darjus
相关产品推荐
相关产品推荐

