You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 14:43:12