首页 > 解决方案 > Laravel 的 UploadedFile 存储方法的行为与 Storage::url 行为不对应

问题描述

所以我有一个 UploadedFile 我想上传到特定磁盘“本地”。

// $storedFilePath == "kml/uploadedfile.xml";
$storedFilePath = $request->file->store("kml", "local");

该文件实际上已上传到 storage/app/kml/uploadedfile.xml - 这是正确的,遵循本地磁盘的配置:

    'local' => [
        'driver' => 'local',
        'root' => storage_path('app'),
    ],

另一方面,我需要获取此文件的完整 URL 路径(相对于项目根目录)。我试过了

 Storage::disk("local")->url($storedFilePath);

但这让我明白了/storage/kml/uploadedfile.xml- 请注意路径确实错过了 app/ 文件夹。

Laravel 的 FilesystemAdapter.php 中确定路径的一行在这里(函数 getLocalUrl):

    $path = '/storage/'.$path;

鉴于 $path 是以 kml/ 开头的事实,它不起作用是完全有道理的。我的问题是,为什么。为什么这些不对应,我如何获得完整的内部(而不是公共)路径?

标签: laravelfilesystemsstorage

解决方案


好的,这实际上很简单,但我相信 Laravel 中关于此的文档相当混乱。Laravel 只是希望每个人都有一个从 public/storage 到 storage/app/public 的符号链接

他们甚至认为每个使用本地磁盘和方法 url 的人都想知道公共 url,这仅适用于公共磁盘。

配置/文件系统.php

添加了“网址”

   'local' => [
        'driver' => 'local',
        'root' => storage_path('app'),
        'url' => storage_path('app')
    ],

现在可以正常工作


推荐阅读