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
相关产品推荐
相关产品推荐

