前言:记录了七牛云上传图片的简单封装、若有不足 欢迎指正。
开始前准备:
A、七牛sdk版本一定要和dart版本相对应(推荐用any方式、让其自己去匹配);
qiniu_flutter_sdk: any
B、七牛上传文件所需的参数:
1、token->去自己服务器拉取就好、这个一般由后端来管理;
2、file ->要上传的文件;
3、key -> 类似于文件id (后面讲)
本文网络层用的dio库、无需关注
官方文档: Flutter SDK_SDK 下载_对象存储 - 七牛开发者中心
1、上代码:
class QiNiuManager{
static final QiNiuManager instance = QiNiuManager.internal();
factory QiNiuManager(){
return instance;
}
QiNiuManager.internal();
///七牛上传配置类
Storage storage = Storage();
///上传进度监听、及上传状态控制(取消上传...)
PutController putController = PutController();
String? domain;
///获取七牛token T
_fetchQiniuToken(NetworkCompletion networkCompletion){
EioHttpManager().post(ApiUser.qiniuToken).then((respons){
if(respons.isSuccess){
QiNiuEntity qnEntity = QiNiuEntity.fromJson(respons.data);
domain = qnEntity.domain;
networkCompletion(qnEntity.token);
}
});
}
///上传文件
uploadFile(File file,NetworkCompletion networkCompletion,{ProgressListener? progressListener}){
debugPrint('uploadFile ${file.toString()}');
// 添加整体进度监听
if (progressListener != null) {
putController.addProgressListener((percent) {
progressListener(percent);
});
}
// 添加状态监听
putController.addStatusListener((status) {
if (status == StorageStatus.Success) {
debugPrint('StorageStatus Success');
} else
if(status == StorageStatus.Error){
networkCompletion(null);
debugPrint('StorageStatus Error');
} else
if(status == StorageStatus.Cancel){
networkCompletion(null);
debugPrint('StorageStatus Cancel');
}
});
var key = '${file.path}/${DateTime.now().millisecondsSinceEpoch}';
_fetchQiniuToken((data) => {
debugPrint('七牛token $data'),
// 使用 storage 的 putFile 对象进行文件上传
storage.putFile(file, data, options: PutOptions(
controller: putController,
key: key
)).then((value){
debugPrint('hash ${value.hash} key ${value.key} rawData ${value.rawData} toString ${value.toString()}');
networkCompletion('$domain/${value.hash}');
})
});
}
///取消上传
cancelUpload() => putController.cancel();
}
用于回调的函数:
代码:
//所有的回调方法
typedef NetworkCompletion = Function(dynamic data);
//进度回调
typedef ProgressListener = Function(double progress);
注意:
_fetchQiniuToken() 函数无需关注、主要为了获取七牛的token;
ProgressListener 用于进度回调、NetworkCompletion 用于成功后回调;
注意key的设置、此处是以文件路径+时间戳、如果key不设置 会有概率出现文件上传失败问题(报文件已存在错误);
key应该就是存储在七牛的文件名、目前还不清楚七牛是如何处理默认key(不传key)导致文件名冲突问题;
至此over!