或者如何通过Flutter Amplify将图像上传到s3并进行公共访问?
在我目前的flutter项目中,我无法在使用amplify将文件上传到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;
}
到目前为止Flutter Amplify没有提供任何通过公共访问上传图像的选项。它总是通过私人读取访问上传。
因此,我更新了项目中的一些内容,如下所述。
在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进行显示。
我认为您应该使用Dio来声明将用于发布请求的客户端对象你可以在下面的答案中找到一个示例代码