You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 10:18:17