指定的键不存在 - Laravel

3
我试图为我的应用程序中的文件创建一个临时URL。我可以将文件上传到S3存储桶,并使用如下方法\Storage::temporaryUrl($this->url, now()->addHour(1))生成以下URL。
https://xxxxxx.s3.eu-west-2.amazonaws.com/https%3A//xxxxxxx.s3.eu-west-2.amazonaws.com/images/fYr20cgYh3nAwoEEQCOTaVTLLo7nRFrXjp7cYcCz.jpg?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAVHH6TLEV3Z2FBWLY%2F20210622%2Feu-west-2%2Fs3%2Faws4_request&X-Amz-Date=20210622T191649Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=6300aa81e69c6f4c96cb6f319a2b5ed2bfc2b2767138994928a49f3f93906745

当我点击此URL时,出现以下错误:
The specified key does not exist.

根据此问题https://dev59.com/wF4b5IYBdhLWcg3wzUja#28654035,我已经检查了以下内容:

  • 文件名存在于我的存储桶中,并且是从存储桶中的Object URL复制粘贴而来的。
  • 尝试移除文件扩展名以查看其是否影响URL,但没有成功。文件名为xxxx.jpgxxxxx时一样

file name from my bucket

我是AWS新手,因此我将复制并粘贴我认为可能有助于解决问题的重要信息。

创建的IAM用户具有以下权限:

  • AmazonS3FullAccess

对于该帐户,存储桶Block Public Access settings for this account被全部阻止:

Block Public Access settings for this account

我的存储桶公共访问权限也全部启用:

my bucket permissions

我目前作为根用户登录(因此我假定我可以做任何我想做的事情,因为我是根用户)

如果我将所有存储桶都设为公共访问,我就能够使用temporaryUrl方法生成的URL提取文件。

最终目标

该存储桶的目标是用于存储应用程序用户上传的文件。我不想使所有文件都公开,因此我想限制用户访问他们所拥有的文件,因此我使用临时URL创建了它们。

Storage::disk('s3')->temporaryUrl($url, now()->addMinutes(30));

因为我对将文件存储在S3中还比较陌生,所以我的逻辑可能有误。如果这不是正确的做法,请纠正我。

我看过但没有帮助我的问题


1
据我所见,文件URL包含了AWS存储桶URL两次,而实际上应该只出现一次。问题出在你传递给temporaryUrl方法的URL/文件路径上,其中已经包含了AWS存储桶的URL。你应该只传递文件路径而不是整个URL,不要包含存储桶的URL。 - OMi Shah
1个回答

2
在你的第一个URL中,看起来你把主机名重复了 - https://xxxxxx.s3.eu-west-2.amazonaws.com 出现了一次,然后又编码了一次。你是将完整的主机名存储在$url参数中传递给temporaryUrl方法吗?你应该只传递密钥(实际文件名)给该方法。
错误听起来不像是权限错误 - 似乎你可以访问桶,只是没有正确获取文件路径。

就是这样。谢谢。 - Bruno Francisco

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