Flutter AWS S3存储插件simple_s3的使用
Flutter AWS S3存储插件simple_s3的使用
简介
simple_s3
是一个高级且易于使用的AWS S3插件,支持文件上传和删除功能。它使用AWS原生SDK为iOS和Android提供服务。
特性
特性 | 描述 |
---|---|
Null Safe | ✅ |
上传百分比 | ✅ |
支持所有文件类型 | 自动检测文件扩展名以确定内容类型 |
设置访问权限 | 允许设置文件的访问权限(如PublicRead, Private等),默认为Public Read |
时间戳 | 可选择在文件名中添加时间戳,默认位置为前缀 |
自定义文件名 | 允许更改上传文件的名称,必须包含扩展名 |
自定义S3文件夹路径 | 将文件上传到特定的S3文件夹 |
子区域支持 | 支持带有子区域的S3服务器进行上传/删除操作 |
删除对象 | 支持删除S3中的文件对象 |
自动生成URL | 自动生成指向S3文件的URL |
快速开始
添加依赖
在pubspec.yaml
中添加以下依赖:
dependencies:
simple_s3: ^0.3.2
示例代码
以下是一个完整的示例应用,展示了如何使用simple_s3
插件进行文件上传和删除操作。
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:simple_s3/simple_s3.dart';
// 假设Credentials.dart文件中有以下内容:
// const String s3_bucketName = "your-bucket-name";
// const String s3_poolD = "your-pool-id";
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: "S3 Upload/Delete Demo",
home: Scaffold(body: SimpleS3Test()),
);
}
}
class SimpleS3Test extends StatefulWidget {
@override
SimpleS3TestState createState() => SimpleS3TestState();
}
class SimpleS3TestState extends State<SimpleS3Test> {
File? selectedFile;
SimpleS3 _simpleS3 = SimpleS3();
bool isLoading = false;
bool uploaded = false;
@override
void dispose() {
super.dispose();
}
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: StreamBuilder<dynamic>(
stream: _simpleS3.getUploadPercentage,
builder: (context, snapshot) {
return new Text(
snapshot.data == null ? "Simple S3 Test" : "Uploaded: ${snapshot.data}",
);
}),
),
body: Center(
child: selectedFile != null
? isLoading
? CircularProgressIndicator()
: Image.file(selectedFile!)
: GestureDetector(
onTap: () async {
final pickedFile = await ImagePicker().getImage(source: ImageSource.gallery);
if (pickedFile != null) {
setState(() {
selectedFile = File(pickedFile.path);
});
}
},
child: Icon(
Icons.add,
size: 30,
),
),
),
floatingActionButton: !isLoading
? FloatingActionButton(
backgroundColor: uploaded ? Colors.green : Colors.blue,
child: Icon(
uploaded ? Icons.delete : Icons.arrow_upward,
color: Colors.white,
),
onPressed: () async {
if (uploaded) {
print(await SimpleS3.delete(
"test/${selectedFile!.path.split("/").last}",
Credentials.s3_bucketName,
Credentials.s3_poolD,
AWSRegions.apSouth1,
debugLog: true));
setState(() {
selectedFile = null;
uploaded = false;
});
}
if (selectedFile != null) _upload();
},
)
: null,
);
}
Future<String?> _upload() async {
try {
setState(() {
isLoading = true;
});
final result = await _simpleS3.uploadFile(
selectedFile!,
Credentials.s3_bucketName,
Credentials.s3_poolD,
AWSRegions.apSouth1,
debugLog: true,
s3FolderPath: "test",
accessControl: S3AccessControl.publicRead,
);
setState(() {
uploaded = true;
isLoading = false;
});
return result;
} catch (e) {
print(e);
return null;
}
}
}
注意事项
-
Android Release Mode:如果在Android发布模式下遇到问题,请确保在
app/build.gradle
中正确配置Proguard规则。具体步骤如下:buildTypes { release { signingConfig signingConfigs.release minifyEnabled true useProguard true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-aws-2.1.5.pro' } }
并将proguard-aws-2.1.5.pro的内容复制到项目的
app
目录下。
通过以上步骤,您可以顺利地在Flutter项目中集成并使用simple_s3
插件进行AWS S3的文件上传和删除操作。
更多关于Flutter AWS S3存储插件simple_s3的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter AWS S3存储插件simple_s3的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用simple_s3
插件与AWS S3进行交互的示例代码。simple_s3
插件允许你轻松地从Flutter应用中上传和下载文件到AWS S3。
1. 添加依赖
首先,你需要在pubspec.yaml
文件中添加simple_s3
依赖:
dependencies:
flutter:
sdk: flutter
simple_s3: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
2. 配置AWS S3
你需要AWS S3的访问密钥(Access Key)、秘密密钥(Secret Key)、区域(Region)以及你想要操作的桶(Bucket)名称。这些敏感信息不应该硬编码在客户端应用中,而应该通过环境变量或安全的后端服务来管理。
3. 初始化并上传文件
以下是一个初始化simple_s3
并上传文件的示例:
import 'package:flutter/material.dart';
import 'package:simple_s3/simple_s3.dart';
import 'dart:io';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter AWS S3 Example'),
),
body: Center(
child: UploadButton(),
),
),
);
}
}
class UploadButton extends StatefulWidget {
@override
_UploadButtonState createState() => _UploadButtonState();
}
class _UploadButtonState extends State<UploadButton> {
final S3Client s3Client = S3Client(
accessKey: 'YOUR_ACCESS_KEY',
secretKey: 'YOUR_SECRET_KEY',
region: 'YOUR_REGION',
bucket: 'YOUR_BUCKET_NAME',
);
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: () async {
// 选择文件
final FilePickerResult result = await FilePicker.platform.pickFiles();
if (result == null || result.files.isEmpty) return;
final File file = File(result.files.first.path);
// 上传文件
try {
final UploadFileResult uploadResult = await s3Client.uploadFile(
file,
'path/in/s3/${file.basename}', // 指定S3中的路径和文件名
);
print('Upload successful: ${uploadResult.url}');
} catch (e) {
print('Upload failed: $e');
}
},
child: Text('Upload File'),
);
}
}
4. 下载文件
以下是一个从S3下载文件的示例:
ElevatedButton(
onPressed: () async {
final String remoteFilePath = 'path/in/s3/your-file.ext';
final String localFilePath = '${(await getApplicationDocumentsDirectory()).path}/your-file.ext';
try {
final DownloadFileResult downloadResult = await s3Client.downloadFile(
remoteFilePath,
localFilePath,
);
print('Download successful: ${downloadResult.path}');
// 可选:打开或展示下载的文件
// 例如,如果它是一个图片文件,你可以使用Image.file(File(downloadResult.path))来显示它
} catch (e) {
print('Download failed: $e');
}
},
child: Text('Download File'),
)
注意事项
- 安全性:永远不要在客户端代码中硬编码AWS凭证。使用AWS Cognito、环境变量或安全的后端服务来管理这些敏感信息。
- 错误处理:在实际应用中,你应该添加更多的错误处理逻辑,比如网络错误、文件读写错误等。
- 权限:确保你的AWS S3桶和对象策略正确设置,以便你的应用可以访问和修改所需的资源。
希望这些示例代码能帮助你在Flutter项目中成功使用simple_s3
插件与AWS S3进行交互。