flutter七牛云上传sdk插件qiniu_flutter_sdk使用
最近在拆分代码,将上传组件设置成插件,下面记录下实现过程。
一、创建flutter_plugin上传插件
这里Android Studio使用创建plugin
填写一下信息
- Project name
- Project location
- Description
- Project type
- Organization
- Android Language
- iOS Language
- Platforms
二、代码实现
2.1、实现qiniu_token
// 定义获取token接口
abstract class QiniuToken {
Future<String> getToken();
}
2.2、实现qiniu_token
class QiniuTokenImpl implements QiniuToken {
Future<String> getToken() {
// TODO: implement getToken
return Future.value("");
}
}
2.3、实现qiniu_uploader
这里使用qiniu_flutter_sdk插件进行上传。
上传需要用到Storage、PutController。
PutController可以用来监听上传的状态等
- PutController
// 创建 storage 对象
storage = Storage();
// 创建 Controller 对象
putController = PutController();
// 添加整体进度监听
putController.onProgress((double percent) {
print('任务进度变化:已发送:$percent');
});
// 添加发送进度监听
putController.onSendProgress((double percent) {
print('已上传进度变化:已发送:$percent');
});
// 添加状态监听
putController.addStatusListener((StorageStatus status) {
print('状态变化: 当前任务状态:$status');
});
// 使用 storage 的 putFile 对象进行文件上传
storage.putFile(File('./file.txt'), 'TOKEN', PutOptions(
controller: putController,
))
- storage
使用前必须创建一个 Storage 实例
// 创建 storage 对象
storage = Storage();
同时,在构造 Storage 时可以传入一个 Config 控制内部的一些行为,如下:
// 创建 storage 对象
storage = Storage(Config(
// 通过自己的 hostProvider 来使用自己的 host 进行上传
hostProvider: HostProvider,
// 可以通过实现 cacheProvider 来自己实现缓存系统支持分片断点续传
cacheProvider: CacheProvider,
// 如果你需要对网络请求进行更基础的一些操作,你可以实现自己的 HttpClientAdapter 处理相关行为
httpClientAdapter: HttpClientAdapter,
// 设定网络请求重试次数
retryLimit: 3,
));
实现上传的代码如下
QiniuToken qiniuToken;
// 创建 storage 对象
// 设定网络请求重试次数
final Storage storage = Storage(
config: Config(
retryLimit: 3,
));
final PutController putController = PutController();
QiniuUploader(this.tokenFetch) {
_listen();
}
Future<UploaderResp> upload(UploaderReq uploaderReq) async {
// TODO: implement upload
if (uploaderReq is QiniuUploaderReq) {
File? file = uploaderReq.req['file'];
if (file != null) {
String token = await qiniuToken.getToken();
PutResponse putResponse = await _uploadFile(file, token);
UploaderResp<PutResponse> resp = UploaderResp();
resp.data = putResponse;
return Future.value(resp);
} else {
throw "upload请求req参数file异常!";
}
} else {
throw "upload请求req类型必须是QiniuUploaderReq类型!";
}
}
_listen() {
// 添加状态监听
putController.addStatusListener((StorageStatus status) {
print('QiniuUploader StorageStatus:$status');
});
}
Future<PutResponse> _uploadFile(File file, String token) async {
String key = md5.convert(utf8.encode(file.path)).toString();
print("key:${key}");
return await storage.putFile(
file,
token,
options: PutOptions(
key: key,
controller: putController,
),
);
}
之后在插件代码中flutter_component_uploader
flutter_component_uploader.dart文件中实现
library flutter_component_uploader;
export 'uploader/qiniu_token.dart';
export 'uploader/qiniu_token_impl.dart';
export 'uploader/qiniu_uploader.dart';
学习记录,每天不停进步。