前言:记录了七牛云上传图片的简单封装、若有不足 欢迎指正。
开始前准备:
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');} elseif(status == StorageStatus.Error){networkCompletion(null);debugPrint('StorageStatus Error');} elseif(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!