我想要从 S3 存储桶进行非授权下载。我已启用公共访问和 ACL 的所有选项。调整设置后,我终于不再遇到拒绝访问的错误。但是,现在我找不到任何文件。 我上传的所有数据都是通过 AWS 网络上传的。
桶政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicRead",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::<the bucket>/*"
}
]}
现在我有一个新问题。我找不到文件,出现此错误:
NoSuchKey
指定的密钥不存在。public//100/gif1.gif(服务:Amazon S3;状态代码:404;错误代码:404 Not Found;请求 ID:***'),
这是代码:
Future<void> downloadFromS3(String key) async {
try {
final localPath = await getApplicationDocumentsDirectory();
final filePath = '$localPath/$key';
final result = await Amplify.Storage.downloadFile(
key: "/100/$key",
local: File(filePath),
);
} catch (e) {
print('Error downloading file [$key] : $e');
}
}
然后我跑:
await configureAmplify();
await downloadFromS3('gif1.gif');
我的存储桶结构如下:myBucket/100/gif1.gif。
我已经被困在这个问题上有一段时间了,我唯一可以假设的问题是,在错误代码中你可以看到一个 public 前缀“public//100/gif1.gif”。我没有,我尝试创建一个文件夹“public”,例如 myBucket/public/folder100/file。然而,这也没有真正起作用。
怎么了?
看来问题可能与您用于下载文件的密钥有关。当您使用 Amplify 上传或列出 S3 存储桶中的对象时,它通常会为密钥添加前缀,例如“公共”、“私有”或“受保护”,具体取决于您在上传期间指定的访问级别。这可以解释为什么您在错误消息中看到“public //100/gif1.gif”。
您可能想研究一下这个堆栈问题,看看是否有帮助
如何在执行 S3 操作时阻止 aws-amplify 在 url 中附加级别和identityPoolId
还要验证 S3 存储桶中文件的确切密钥。您可以通过使用 AWS S3 控制台或 AWS CLI 列出存储桶中的对象来执行此操作。