如何在Flutter中通过键名下载AWS S3存储桶对象并本地保存?
在Flutter中从AWS S3下载对象并保存到本地
以下是两种实用的实现方式,均基于已知对象键名完成操作:
方法一:使用AWS Amplify Flutter(官方推荐)
Amplify是AWS官方提供的Flutter集成工具,能简化与S3等服务的交互流程。
1. 添加依赖
在pubspec.yaml中添加依赖包:
dependencies: amplify_flutter: ^1.0.0 amplify_storage_s3: ^1.0.0 path_provider: ^2.0.0
执行flutter pub get完成依赖安装。
2. 配置Amplify
在应用初始化阶段完成Amplify配置(例如main.dart的main函数中):
import 'package:amplify_flutter/amplify_flutter.dart'; import 'package:amplify_storage_s3/amplify_storage_s3.dart'; import 'package:flutter/material.dart'; // 替换为你的AWS Amplify配置(从AWS控制台获取) const amplifyConfig = '''{ "UserAgent": "aws-amplify-cli/2.0", "Version": "1.0", "storage": { "plugins": { "awsS3": { "bucket": "your-s3-bucket-name", "region": "your-aws-region", "defaultAccessLevel": "guest" } } } }'''; Future<void> configureAmplify() async { try { final storagePlugin = AmplifyStorageS3(); await Amplify.addPlugin(storagePlugin); await Amplify.configure(amplifyConfig); print('Amplify配置成功'); } on Exception catch (e) { print('Amplify配置失败:$e'); } } void main() async { WidgetsFlutterBinding.ensureInitialized(); await configureAmplify(); runApp(const MyApp()); }
3. 下载并保存到本地
编写下载函数,将S3对象保存到应用的文档目录:
import 'package:path_provider/path_provider.dart'; import 'package:amplify_flutter/amplify_flutter.dart'; import 'dart:io'; Future<void> downloadFromS3(String s3Key) async { try { // 获取应用专属文档目录 final directory = await getApplicationDocumentsDirectory(); final localFileName = s3Key.split('/').last; final localFilePath = '${directory.path}/$localFileName'; // 执行下载并保存 final result = await Amplify.Storage.downloadFile( key: s3Key, localFile: AWSFile.fromPath(localFilePath), ); print('文件已保存到:${result.localFile.path}'); } on StorageException catch (e) { print('下载失败:${e.message}'); } }
方法二:直接通过HTTP请求(无需Amplify)
如果S3对象是公开可读的,或你能生成预签名URL,可直接用HTTP请求完成下载:
1. 添加依赖
dependencies: dio: ^5.0.0 path_provider: ^2.0.0
2. 下载代码
import 'package:dio/dio.dart'; import 'package:path_provider/path_provider.dart'; import 'dart:io'; Future<void> downloadFileFromS3(String s3Key) async { final dio = Dio(); // 替换为你的S3对象公开URL(格式:https://桶名.s3.区域.amazonaws.com/对象键) final s3Url = 'https://your-bucket-name.s3.your-region.amazonaws.com/$s3Key'; try { final directory = await getApplicationDocumentsDirectory(); final localFileName = s3Key.split('/').last; final localFilePath = '${directory.path}/$localFileName'; // 带进度的下载 await dio.download( s3Url, localFilePath, onReceiveProgress: (received, total) { if (total != -1) { print('下载进度:${(received / total * 100).toStringAsFixed(0)}%'); } }, ); print('文件已保存到:$localFilePath'); } catch (e) { print('下载失败:$e'); } }
注意事项
- 若S3对象为私有,需在请求中添加AWS签名,这种场景更推荐使用方法一,自行实现签名逻辑复杂度较高。
- 确保应用具备文件读写权限:Android需在
AndroidManifest.xml中添加<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>(适配旧版本);iOS需在Info.plist中配置NSDocumentsFolderUsageDescription。
内容的提问来源于stack exchange,提问作者Mukesh Gupta
相关产品推荐
相关产品推荐

