Flutter亚马逊S3存储插件s3_storage的使用
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
更多关于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下载文件。
注意事项:
-
安全性:直接在客户端代码中硬编码AWS凭证(如
accessKey
和secretKey
)是不安全的。考虑使用AWS Cognito、IAM角色或环境变量来安全地管理凭证。 -
权限:确保你的IAM角色或用户具有对指定存储桶的读写权限。
-
错误处理:在生产代码中,添加更详细的错误处理逻辑,以处理各种可能的异常情况。
-
路径:确保提供的本地文件路径和S3键(key)路径是有效的,并且应用有权限访问这些路径。
-
依赖版本:确保使用
s3_storage
插件的最新稳定版本,并查阅其文档以获取最新的使用指南和API变更。