前言:记录了七牛云上传图片的简单封装、若有不足 欢迎指正。
开始前准备:
A、七牛sdk版本一定要和dart版本相对应(推荐用any方式、让其自己去匹配);

 qiniu_flutter_sdk: anyB、七牛上传文件所需的参数:
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!



















