Flutter AWS S3客户端操作插件flutter_aws_s3_client的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter AWS S3 客户端操作插件 flutter_aws_s3_client 的使用

注意: 由于现在已有官方的 AWS 服务访问包,此插件已不再维护。建议迁移至 AWS Amplify FlutterAmplify Storage S3 示例

flutter_aws_s3_client

该插件支持从 S3 下载对象和列出桶中的对象。大部分复杂的工作由 Amazon Cognito Identity SDK for Dart 完成,本项目仅包含一些常用的便捷方法。如果你需要更多的请求,可以直接构建所需的请求。如果有更多方法实现,欢迎提交 Pull Request。

使用方法

构建客户端
const region = "eu-central-1";
const bucketId = "yourBucketId";
final AwsS3Client s3client = AwsS3Client(
    region: region,
    host: "s3.$region.amazonaws.com",
    bucketId: bucketId,
    accessKey: "<your access key>",
    secretKey: "<your secret key>");
获取对象
final response = await s3client.getObject("your/object/key"); 
print(response.body.toString());
列出桶中的对象
ListBucketResult listBucketResult = await s3client.listObjects(prefix: "dir1/dir2/", delimiter: "/");
print(listBucketResult.toString());
下载大对象到文件(流式处理)

如果需要下载大对象而不一次性加载到内存中,可以使用 buildSignedGetParams 方法。

示例代码(带 ETag 支持):

Future<void> download(String key, File file, [String etag = null]) async {
  final signedParams = awsS3Client.buildSignedGetParams(key: key);

  final request = await HttpClient().getUrl(signedParams.uri);

  for (final header in (signedParams.headers ?? const {}).entries) {
    request.headers.add(header.key, header.value);
  }
  if(etag != null){
    request.headers.add(HttpHeaders.ifNoneMatchHeader, etag);
  }
  final response = await request.close();
  if(response.statusCode != HttpStatus.ok){
     // 处理错误
  } else {
     return response.pipe(file.openWrite());
  }
}

完整示例代码

以下是一个完整的示例代码,展示了如何使用 flutter_aws_s3_client 插件来列出桶中的对象并获取对象。

import 'dart:io';
import 'package:flutter_aws_s3_client/flutter_aws_s3_client.dart';
import 'package:path_provider/path_provider.dart';

void main() async {
  const region = "eu-central-1";
  const bucketId = "yourBucketId";
  final AwsS3Client s3client = AwsS3Client(
      region: region,
      host: "s3.$region.amazonaws.com",
      bucketId: bucketId,
      accessKey: "<your access key>",
      secretKey: "<your secret key>");

  // 列出桶中的对象
  ListBucketResult listBucketResult = await s3client.listObjects(prefix: "dir/dir2/", delimiter: "/");
  print(listBucketResult.toString());

  // 获取对象
  final response = await s3client.getObject("yourObjectId");
  print(response.body.toString());

  // 下载大对象到文件
  final directory = await getApplicationDocumentsDirectory();
  final file = File("${directory.path}/yourFile.txt");
  await download("your/large/object/key", file);
}

// 下载函数
Future<void> download(String key, File file, [String etag = null]) async {
  final signedParams = awsS3Client.buildSignedGetParams(key: key);

  final request = await HttpClient().getUrl(signedParams.uri);

  for (final header in (signedParams.headers ?? const {}).entries) {
    request.headers.add(header.key, header.value);
  }
  if(etag != null){
    request.headers.add(HttpHeaders.ifNoneMatchHeader, etag);
  }
  final response = await request.close();
  if(response.statusCode != HttpStatus.ok){
     // 处理错误
  } else {
     return response.pipe(file.openWrite());
  }
}

更多关于Flutter AWS S3客户端操作插件flutter_aws_s3_client的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter AWS S3客户端操作插件flutter_aws_s3_client的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 flutter_aws_s3_client 插件的示例代码,这个插件允许你在 Flutter 应用中操作 AWS S3 服务。为了演示,我们将展示如何上传和下载一个文件到 AWS S3。

首先,确保你已经在 pubspec.yaml 文件中添加了 flutter_aws_s3_client 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_aws_s3_client: ^0.2.0  # 请检查最新版本号

然后运行 flutter pub get 来获取依赖。

配置 AWS 凭证

在使用 AWS S3 服务之前,你需要配置 AWS 凭证(Access Key ID 和 Secret Access Key)。这通常通过环境变量或配置文件(如 ~/.aws/credentials)来管理。在 Flutter 应用中,你可以直接在代码中设置这些凭证(注意:在生产环境中,应使用更安全的方式来管理凭证,如 AWS Cognito 或 AWS Amplify)。

示例代码

1. 初始化 AWS S3 客户端

import 'package:flutter_aws_s3_client/flutter_aws_s3_client.dart';
import 'dart:io';

final AmazonS3Client amazonS3Client = AmazonS3Client(
  region: 'your-region',  // 例如 'us-west-2'
  accessKey: 'your-access-key-id',
  secretKey: 'your-secret-access-key',
);

2. 上传文件到 S3

Future<void> uploadFileToS3(File file, String bucketName, String keyName) async {
  try {
    var result = await amazonS3Client.putObject(
      bucket: bucketName,
      key: keyName,
      body: file.openRead(),
      contentType: 'application/octet-stream',  // 根据实际情况设置 MIME 类型
    );
    print('File uploaded successfully: ${result.eTag}');
  } catch (e) {
    print('Error uploading file: $e');
  }
}

// 使用示例
void _uploadExample() async {
  File file = File('/path/to/your/file.txt');
  String bucketName = 'your-bucket-name';
  String keyName = 'your-file-key.txt';
  
  await uploadFileToS3(file, bucketName, keyName);
}

3. 从 S3 下载文件

Future<File?> downloadFileFromS3(String bucketName, String keyName, String localPath) async {
  try {
    var getObjectResult = await amazonS3Client.getObject(
      bucket: bucketName,
      key: keyName,
    );
    
    File localFile = File(localPath);
    await localFile.writeAsBytes(getObjectResult.body!.bytes);
    print('File downloaded successfully: ${localFile.path}');
    return localFile;
  } catch (e) {
    print('Error downloading file: $e');
    return null;
  }
}

// 使用示例
void _downloadExample() async {
  String bucketName = 'your-bucket-name';
  String keyName = 'your-file-key.txt';
  String localPath = '/path/to/save/downloaded/file.txt';
  
  File? downloadedFile = await downloadFileFromS3(bucketName, keyName, localPath);
  if (downloadedFile != null) {
    print('File saved to: ${downloadedFile.path}');
  }
}

注意事项

  1. 安全性:在生产环境中,避免直接在代码中硬编码 AWS 凭证。可以使用 AWS Cognito、AWS Amplify 或其他安全方式来管理凭证。
  2. 错误处理:上面的代码示例中只简单地打印了错误信息。在实际应用中,应该有更详细的错误处理和用户反馈。
  3. 依赖版本:确保你使用的是 flutter_aws_s3_client 的最新版本,并查看其文档以获取最新的 API 和功能。

通过这些代码示例,你应该能够在 Flutter 应用中成功地使用 flutter_aws_s3_client 插件来操作 AWS S3 服务。

回到顶部