Laravel上传文件后读取报不存在错误 如何正确指定文件路径
Laravel Storage文件读取路径错误修复方案
错误根源
你遇到的文件不存在报错,本质是混淆了服务端文件读取路径和web访问静态资源路径:
- 调用
storeAs('uploads', $fileName, 'public')时,返回值已经是public磁盘下的正确相对路径,格式为uploads/[文件名] - 手动给路径拼接的
/storage/前缀,是给浏览器访问软链资源用的,不是Storage门面读取服务器本地文件的合法路径。Storage默认读取storage/app/目录下的文件,拼接后它会去找storage/app/storage/uploads/xxx.csv,路径自然不存在。
正确实现方式
1. 服务端代码读取上传文件
不要手动拼接/storage/前缀,读取时明确指定使用public磁盘即可:
修正上传逻辑
public function fileUpload(Request $req) { $req->validate([ 'file' => 'required|mimes:csv,txt,xlx,xls,pdf|max:2048' ]); $fileModel = new File(); if ($req->file()) { $fileName = time() . '_' . $req->file->getClientOriginalName(); // 这里返回的是public磁盘下的相对路径,形如 uploads/xxx.csv $filePath = $req->file('file')->storeAs('uploads', $fileName, 'public'); $fileModel->name = $fileName; // 数据库只存相对路径,不要拼/storage/前缀 $fileModel->file_path = $filePath; $fileModel->save(); $this->read($fileModel->file_path); return back() ->with('success', 'File has been uploaded.') ->with('file', $fileName); } }
修正读取逻辑
public function read($path) { // 明确指定使用public磁盘读取文件 $file = \Storage::disk('public')->get($path); dd($file); }
2. 生成web可访问的文件链接
如果需要给前端返回文件访问地址,才需要拼接storage前缀,推荐用框架自带的助手函数生成:
// 生成的地址格式为 你的域名/storage/uploads/xxx.csv,可直接在浏览器访问 $accessUrl = asset('storage/' . $fileModel->file_path);
首次使用public磁盘存文件,需要先在项目根目录执行
php artisan storage:link命令生成目录软链,否则web访问会返回404。
内容的提问来源于stack exchange,提问作者Anastasia
相关产品推荐
相关产品推荐

