1

或者如何通过 Flutter Amplify 将图像上传到具有公共访问权限的 s3?

在我当前的颤振项目中,我无法在使用放大将文件上传到 S3 时传递 ACL:public-read 属性。

因此,每当我将新文件上传到 s3 时,我都需要手动将其公开。所以我只想为每个人上传一个具有公共读取权限的新文件。

我为 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;
}
4

2 回答 2

0

我认为您应该使用Dio来声明将用于发布请求的客户端对象您可以在以下答案中找到示例代码

于 2021-04-05T22:51:12.667 回答
0

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

所以我在我的项目中更新了一些东西,如下所述。

在 Amplify 集成之前,我将图像上传到S3并将该 URL 存储到我的服务器,无论我必须显示什么,我只是从我的服务器获取 URL 并加载图像。

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

为了显示图像,我使用该图像从 Amplify 获取图像 URL key(存储在我的服务器中)。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显示。

于 2021-12-23T07:34:14.983 回答