我是使用 amazon s3 和 laravel 的初学者,我无法调用 url() 方法从 s3 文件中检索完整的 url。
我在 Laravel 版本 5.8.29
并为 s3 安装了适当的 Composer 包
在将文件上传到存储桶后,我正在测试检索 url。上传成功。
use Illuminate\Support\Facades\Storage;
$url = Storage::url('file.jpg');
$url = Storage::disk('s3')->url('image.png');
使用 Storage::url('file.jpg') 可以,但是
使用 Storage::disk('s3')->url('image.png') 我会收到一条错误消息“未定义的方法'url'”,即使它在 laravel 官方文档中,我也不知道为什么。
最佳答案
我也对这个“错误”感到厌烦。 VSCode 和 Intelephene 一直在说 Undefined method 'url'
对于任何 Storage::disk('s3')->url('path.ext');
,即使知道这是 Laravel docs File Storage 上建议的方法.对于特定于 5.8 的文档,look here .
显然,处理这个问题的方法不止一种,我不确定在不改变 Laravel 本身的情况下选择哪种方法是正确的。我会告诉你我认为最好的方法,至少对我来说是这样,因为我正在尝试解决同样的问题。
外面建议的一些方法是:
Storage::cloud()->url('filename.ext');
但我承认我不喜欢它,因为我更喜欢指定磁盘名称。请记住,要使用它,您将定义
cloud
配置在 config/filesystems.php
,像这样:'cloud' => env('FILESYSTEM_CLOUD', 's3')
.但是如果有什么我们可以通过 cloud
学习的东西方法,是它在读取代码时向 IDE 返回正确的类型(我们将使用它)。 cloud
上面的方法,它返回 \Illuminate\Filesystem\FilesystemManager
.因此,我们可以使用它在变量注释中指定它,如下所示:/** @var \Illuminate\Filesystem\FilesystemManager $disk */
$disk = Storage::disk('s3');
$url = $disk->url('filename.ext');
Greg提到here .我真的很喜欢这个实现,我可能会使用它。请记住,您还可以始终创建一个方法以在任何地方返回该方法以避免重复代码:
/**
* Return the s3 storage disk.
*
* @return \Illuminate\Filesystem\FilesystemAdapter
*/
private function getDisk()
{
return Storage::disk('s3');
}
$s3 = Storage::disk('s3')->getAdapter()->getClient();
$url = $s3->getObjectUrl(env('AWS_BUCKET'), 'filename.ext');
即使无需设置文件系统
url
,这也可能会生成 url在配置中,但正如人们评论的那样,它可能不适用于非公共(public) s3 目录。据我测试,如果你有 url
在配置中设置它只会不考虑它。就个人而言,在所有这些原因之后,我不喜欢这个。 如您所见,现在更快更干净的方法是使用
@var
符号 .希望有人在不久的将来解决这个问题,或者出现另一种更好的方法。如果有人知道更好的东西,请在评论中告诉我,我很乐意在这里更新。
相关资料:
如果这有帮助,请记住考虑接受答案或点赞。
关于Laravel s3 存储 : undefined method 'url' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59677786/