将文件上传到 S3 时如何将 ACL 属性传递给 flutter amplify?

How to pass ACL properties to flutter amplify while uploading file to S3?

或者如何通过 Flutter Amplify public 访问将图像上传到 s3?

在我目前的flutter项目中,使用amplify上传文件到S3时无法通过ACL:public-read 属性。

因此,每当我将新文件上传到 s3 时,我都需要手动进行 public。 所以我只想上传一个新文件,每个人都有 public 读取权限。

我在Javascript项目中找到了一些解决方案,但在Flutter项目中没有。

下面是一个方法,我正在用它来上传。

Future<String> uploadFile(String fileName, File local) async {
try {
  Map<String, String> metadata = <String, String>{};
  metadata['name'] = 'filename';
  metadata['desc'] = 'A file';

  S3UploadFileOptions options = S3UploadFileOptions(accessLevel: StorageAccessLevel.guest, metadata: metadata);
  UploadFileResult result = await Amplify.Storage.uploadFile(key: fileName, local: local, options: options);
  return result.key;
} catch (e) {
  print('UploadFile Err: ' + e.toString());
}

return null;
}

我认为您应该使用 Dio 来声明将用于发布请求的客户端对象 您可以在以下 answer

中找到示例代码

到目前为止 Flutter Amplify 没有提供任何选项来上传具有 public 访问权限的图像。 它始终以私有读取权限上传。

所以我更新了项目中的一些内容,如下所述。

在 Amplify 集成之前,我将图像上传到 S3 并将 URL 存储到 我的服务器 ,以及我拥有的任何地方要显示,我只是从我的服务器获取 URL 并加载图像。

但现在我正在将 key(用于通过 Amplify 将图像上传到 S3)存储到我的服务器。

为了显示图像,我使用 key(存储在我的服务器中)从 Amplify 获取图像 URL。 Amplify 向图像添加令牌 URL,默认有效期为 7 天

Future<String> getUrl(String key) async {
    try {
      S3GetUrlOptions options = S3GetUrlOptions(accessLevel: StorageAccessLevel.guest, expires: 10000);
      GetUrlResult result = await Amplify.Storage.getUrl(key: key, options: options);
      String url = result.url;
      return url;
    } catch (e) {
      print('GetUrl Err: ' + e.toString());
    }

    return null;
  }

这样ImageView就可以显示了