You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Amplify Flutter调用S3 downloadFile提示NoSuchKey问题求助

S3未授权下载时出现NoSuchKey错误(自动添加public前缀)

问题背景

已开启S3存储桶的所有公共访问选项与ACL,配置了公共读的桶策略:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "PublicRead",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::<the bucket>/*"
    }
]}

调用Flutter Amplify的downloadFile时出现NoSuchKey错误,提示The specified key does not exist.public//100/gif1.gif,但实际存储桶结构为myBucket/100/gif1.gif,代码中指定的key为/100/$key,手动创建public文件夹也无法解决。

Flutter下载代码:

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');

问题原因

Amplify Storage默认的accessLevel是public,会自动在文件key前添加public/前缀。你代码里指定的key是/100/gif1.gif,被Amplify拼接后就变成了public//100/gif1.gif(开头的斜杠导致出现双斜杠),和实际文件路径不匹配,所以报错。

解决方法

方案一:修改downloadFile调用,指定guest访问级别

将下载代码中的downloadFile调用添加accessLevel选项,同时去掉key开头的斜杠,避免双斜杠问题:

final result = await Amplify.Storage.downloadFile(
  key: "100/$key", // 去掉开头的斜杠
  local: File(filePath),
  options: StorageDownloadFileOptions(
    accessLevel: StorageAccessLevel.guest,
  ),
);

StorageAccessLevel.guest模式下,Amplify不会自动添加任何前缀,直接使用你指定的key路径,匹配实际存储的100/gif1.gif。

方案二:调整文件存储路径(可选)

如果不想修改代码,可以把网页上传的文件移动到public/100/目录下,这样Amplify自动添加的前缀就能匹配文件路径,但需要改动已有文件的位置,不如方案一灵活。

内容的提问来源于stack exchange,提问作者Coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 16:29:51