Laravel的存储文件公共URL

27
我想检索所有使用storage::putFile('public/spares')储存的文件的公共url。
所以,这是我的问题,我正在使用storage::files('public/spares'),但它提供了来自laravel storage目录的输出。
public/spares/image1.jpg
public/spares/image2.jpg
public/spares/image3.jpg

如何获取上述内容的公共链接

http://localhost/laravel/public/storage/spares/image1.jpg
http://localhost/laravel/public/storage/spares/image2.jpg
http://localhost/laravel/public/storage/spares/image3.jpg

**编辑**

将文件的最后修改日期发送到视图

$docs = File::files('storage/document');
$lastmodified = [];
foreach ($docs as $key => $value) {
   $docs[$key] = asset($value);
   $lastmodified[$key] = File::lastmodified($value);
}
return view('stock.document',compact('docs','lastmodified'));

这是正确的吗?


你使用的是哪个版本的Laravel? - Eric Tucker
我正在使用 Laravel 5.4。 - Daniel Euchar
5个回答

31

首先,您需要在public/storage目录和storage/app/public目录之间创建符号链接,以便访问文件。您可以使用以下命令实现:

php artisan storage:link

那么你可以使用以下方式存储您的文档:

Storage::putFile('spares', $file);

使用以下方式将其作为资产访问:

asset('storage/spares/filename.ext');

请查看公共磁盘的文档

,其中涉及到IT技术相关内容。我会尽力使内容更加通俗易懂,并保留HTML标签。

我想要实现的是获取目录中文件列表并在我的视图中显示它。你提供的解决方案适用于单个资产,而不是获取完整列表。 - Daniel Euchar

26

Storage::url是怎样的?即使用于本地存储也可以工作。

你可以在这里找到更多信息:https://laravel.com/docs/5.4/filesystem#file-urls

如果你想从目录中返回所有文件的URL,你可以像这样做:

return collect(Storage::files($directory))->map(function($file) {
    return Storage::url($file);
})

如果你想要一个非门面的方式,请不要忘记注入 \Illuminate\Filesystem\FilesystemManager 而不是使用 Storage 门面。

编辑:

处理修改日期有两种或更多方法:

将文件传递到视图中。

你可以直接将 Storage::files($directory) 传递到视图中,然后在模板中使用以下代码:

// controller:

return view('view', ['files' => Storage::files($directory)]);

// template:

@foreach($files as $file)
   {{ Storage::url($file) }} - {{ $file->lastModified }} // I'm not sure about lastModified property, but you get the point
@endforeach

返回一个数组:

return collect(Storage::files($directory))->map(function($file) {
     return [
         'file' => Storage::url($file),
         'modified' => $file->lastModified // or something like this
     ]
})->toArray()

它可以适用于一个文件,但无法获取文件夹中的文件数组。 - Daniel Euchar
@DanielEuchar 那为什么不遍历文件夹(Storage::files($directory) - https://laravel.com/docs/5.4/filesystem#directories),然后对每个文件使用 Storage::url 并将其作为集合返回呢?我已经更新了我的答案。 - Jakub Kratina
当然,我们会想办法解决的! :) 如果可以的话,请告诉我。 - Jakub Kratina
太棒了,它能正常工作。现在,我还想将最后修改时间附加到这些数据中,我需要创建一个单独的变量吗?还是有可能使用集合? - Daniel Euchar
太好了!给我看看你的代码,我不确定你想要实现什么。你想将这个集合和最后修改的信息传递到视图中吗? - Jakub Kratina
显示剩余3条评论

5

我知道这个问题相当古老,但我为仍然遇到此问题的任何人提供此答案(适用于 Laravel 5.5+)。

为解决此问题,请按以下方式更新您的文件系统配置并添加“url”键:

'public' => [
        'driver' => 'local',
        'root' => storage_path('app/public'),
        'url' => env('APP_URL').'/storage',
        'visibility' => 'public',
    ],

希望能帮到您 :)

1
$file = Storage::disk('public')->put($folder, request()->file($key), 'public');
$file = Storage::url($file);

请在回答问题时始终给出解释。 - Leena Patel

1

我找到了解决方案,不是搜索存储

$docs = Storage:files('public/spares');

我们可以搜索符号链接

$docs = File:files('storage/spares');

然后通过asset()函数运行它以获取公共URL。有更好的解决方案吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接