Flutter亚马逊S3存储插件s3_storage的使用

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

Flutter亚马逊S3存储插件s3_storage的使用

插件简介

这是非官方的 S3(AWS,MinIO)Dart 客户端 SDK,它提供了简单的 API 来访问任何与 Amazon S3 兼容的对象存储服务器。

API

以下是一些常用的API操作:

  • Bucket 操作

    • makeBucket
    • listBuckets
    • bucketExists
    • removeBucket
    • listObjects
    • listObjectsV2
    • listIncompleteUploads
    • listAllObjects
    • listAllObjectsV2
  • 对象操作

    • getObject
    • getPartialObject
    • fGetObject
    • putObject
    • fPutObject
    • copyObject
    • statObject
    • removeObject
    • removeObjects
    • removeIncompleteUpload
  • 预签名操作

    • presignedUrl
    • presignedGetObject
    • presignedPutObject
    • presignedPostPolicy
  • Bucket 策略和通知操作

    • getBucketNotification
    • setBucketNotification
    • removeAllBucketNotification
    • listenBucketNotification
    • getBucketPolicy
    • setBucketPolicy

使用示例

初始化 MinIO 客户端
// MinIO
final s3_storage = S3Storage(
  endPoint: 'play.min.io',
  accessKey: 'Q3AM3UQ867SPQQA43P2F',
  secretKey: 'zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG',
);

// AWS S3
final s3_storage = S3Storage(
  endPoint: 's3.amazonaws.com',
  accessKey: 'YOUR-ACCESSKEYID',
  secretKey: 'YOUR-SECRETACCESSKEY',
);

// Filebase
final s3_storage = S3Storage(
  endPoint: 's3.filebase.com',
  accessKey: 'YOUR-ACCESSKEYID',
  secretKey: 'YOUR-SECRETACCESSKEY',
  useSSL: true,
);
文件上传
import 'package:s3_storage/io.dart';
import 'package:s3_storage/s3_storage.dart';

void main() async {
  final s3_storage = S3Storage(
    endPoint: 'play.min.io',
    accessKey: 'Q3AM3UQ867SPQQA43P2F',
    secretKey: 'zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG',
  );

  // 使用 fPutObject 上传文件
  await s3_storage.fPutObject('mybucket', 'myobject', 'path/to/file');
}

注意:要使用 fPutObject()fGetObject,你需要导入 'package:s3_storage/io.dart';

带进度条的上传
import 'package:s3_storage/s3_storage.dart';

void main() async {
  final s3_storage = S3Storage(
    endPoint: 'play.min.io',
    accessKey: 'Q3AM3UQ867SPQQA43P2F',
    secretKey: 'zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG',
  );

  // 使用 putObject 并显示上传进度
  await s3_storage.putObject(
    'mybucket',
    'myobject',
    Stream<Uint8List>.value(Uint8List(1024)),
    onProgress: (bytes) => print('$bytes uploaded'), // 打印已上传字节数
  );
}
获取对象
import 'dart:io';
import 'package:s3_storage/s3_storage.dart';

void main() async {
  final s3_storage = S3Storage(
    endPoint: 's3.amazonaws.com',
    accessKey: 'YOUR-ACCESSKEYID',
    secretKey: 'YOUR-SECRETACCESSKEY',
  );

  // 获取对象流
  final stream = await s3_storage.getObject('BUCKET-NAME', 'OBJECT-NAME');

  // 获取对象长度
  print(stream.contentLength);

  // 将对象数据流写入文件
  await stream.pipe(File('output.txt').openWrite());
}

更多关于Flutter亚马逊S3存储插件s3_storage的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter亚马逊S3存储插件s3_storage的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用s3_storage插件来与Amazon S3进行交互的示例代码。这个插件允许你直接从Flutter应用中上传和下载文件到Amazon S3存储桶。

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

dependencies:
  flutter:
    sdk: flutter
  s3_storage: ^x.y.z  # 替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,你需要在Amazon S3上配置一个存储桶,并确保你有适当的IAM角色和策略来允许从你的Flutter应用进行访问。

以下是一个基本的示例代码,展示了如何使用s3_storage插件:

import 'package:flutter/material.dart';
import 'package:s3_storage/s3_storage.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter S3 Storage Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: S3StorageExample(),
    );
  }
}

class S3StorageExample extends StatefulWidget {
  @override
  _S3StorageExampleState createState() => _S3StorageExampleState();
}

class _S3StorageExampleState extends State<S3StorageExample> {
  final S3Storage _s3Storage = S3Storage(
    bucket: 'your-bucket-name',
    region: 'your-region',
    accessKey: 'your-access-key',
    secretKey: 'your-secret-key',
  );

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter S3 Storage Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () async {
                // 上传文件到S3
                String localFilePath = 'path/to/your/local/file.txt';
                String s3Key = 'folder/in/bucket/file.txt';
                try {
                  await _s3Storage.uploadFile(localFilePath, s3Key);
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(content: Text('File uploaded successfully')),
                  );
                } catch (e) {
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(content: Text('Failed to upload file: $e')),
                  );
                }
              },
              child: Text('Upload File'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                // 从S3下载文件
                String s3Key = 'folder/in/bucket/file.txt';
                String localFilePath = 'path/to/save/downloaded/file.txt';
                try {
                  await _s3Storage.downloadFile(s3Key, localFilePath);
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(content: Text('File downloaded successfully')),
                  );
                } catch (e) {
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(content: Text('Failed to download file: $e')),
                  );
                }
              },
              child: Text('Download File'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,包含两个按钮:一个用于上传文件到Amazon S3,另一个用于从Amazon S3下载文件。

注意事项

  1. 安全性:直接在客户端代码中硬编码AWS凭证(如accessKeysecretKey)是不安全的。考虑使用AWS Cognito、IAM角色或环境变量来安全地管理凭证。

  2. 权限:确保你的IAM角色或用户具有对指定存储桶的读写权限。

  3. 错误处理:在生产代码中,添加更详细的错误处理逻辑,以处理各种可能的异常情况。

  4. 路径:确保提供的本地文件路径和S3键(key)路径是有效的,并且应用有权限访问这些路径。

  5. 依赖版本:确保使用s3_storage插件的最新稳定版本,并查阅其文档以获取最新的使用指南和API变更。

回到顶部