我是将 amazon s3与 laravel 一起使用的初学者,我在调用 url(( 方法从 s3 文件中检索完整 url 时遇到问题。
我使用的是Laravel版本5.8.29 并为 S3 安装适当的作曲家软件包
我正在测试在将文件上传到存储桶后检索 url。 上传成功。
use IlluminateSupportFacadesStorage;
$url = Storage::url('file.jpg');
$url = Storage::disk('s3')->url('image.png');
使用 Storage::url('file.jpg'( 是可以的,但是
使用 Storage::d isk('s3'(->url('image.png'(,即使它在 laravel 官方文档中,我也会收到一个错误,说"未定义的方法'url'",我不确定为什么。
我也对这个"错误"感到高兴。VSCode和Intelephense一直说Undefined method 'url'
任何Storage::disk('s3')->url('path.ext');
,即使知道这是Laravel文档文件存储中建议的方法。有关特定于 5.8 的文档,请查看此处。
显然,有多种方法可以解决这个问题,我不确定在不更改Laravel本身的情况下选择哪种方法是正确的方法。我会告诉你我认为最好的,至少对我来说,因为我正在尝试解决同样的事情。
这里建议的一些方法是:
-
使用默认的云文件系统,如下所示:
Storage::cloud()->url('filename.ext');
但我承认我不喜欢它,因为我更喜欢指定磁盘名称。请记住,要使用它,您需要在
config/filesystems.php
定义cloud
配置,如下所示:'cloud' => env('FILESYSTEM_CLOUD', 's3')
。但是,如果我们可以通过cloud
方法学到一些东西,那就是它在读取代码时将正确的类型返回给 IDE(我们将使用它(。 -
根据上面的
cloud
方法,它返回IlluminateFilesystemFilesystemManager
。因此,我们可以使用它在变量注释中指定它,如下所示:/** @var IlluminateFilesystemFilesystemManager $disk */ $disk = Storage::disk('s3'); $url = $disk->url('filename.ext');
格雷格在这里提到了这一点。我真的很喜欢这个实现,我可能会使用它。请记住,您也可以始终创建一个方法以在任何地方返回该方法以避免重复代码:
/** * Return the s3 storage disk. * * @return IlluminateFilesystemFilesystemAdapter */ private function getDisk() { return Storage::disk('s3'); }
- 另一种强大的方法是使用Laravel在表格下使用的一些更隐藏的方法直接生成url:
即使不必在配置中设置文件系统$s3 = Storage::disk('s3')->getAdapter()->getClient(); $url = $s3->getObjectUrl(env('AWS_BUCKET'), 'filename.ext');
url
,这也可能会生成 url,但正如人们评论的那样,它可能不适用于非公共 s3 目录。据我测试,如果您在配置中设置了url
,它只会忽略它。就个人而言,在所有这些原因之后,我不喜欢这样。 - 还有另一种方法,比如扩展外观,但我也不喜欢,我宁愿不在这里发布它,首先是因为对于琐碎的东西来说代码太多,其次不推荐它。但是,当然,如果你想以一种集中的方式处理这个问题,那也许是这条路。
如您所见,如今更快、更干净的方法是使用@var
符号。
希望有人在不久的将来解决此问题,或者出现另一种更好的方法。如果有人知道更好的东西,请在评论中告诉我,我很乐意在这里更新它。
相关信息相关:
- Laravel league/flysystem 使用 AWS S3 获取文件 URL
- 来自 S3 的存储网址
- Laravel 中的 Amazon S3 存储入门
如果这有帮助,请记住考虑接受答案或竖起大拇指。