Flutter 文件上传(七牛云)简单封装

前言:记录了七牛云上传图片的简单封装、若有不足 欢迎指正。


开始前准备:

A、七牛sdk版本一定要和dart版本相对应(推荐用any方式、让其自己去匹配);

Flutter 文件上传(七牛云)简单封装_第1张图片

 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();
}

用于回调的函数:

Flutter 文件上传(七牛云)简单封装_第2张图片

 代码:

//所有的回调方法
typedef NetworkCompletion = Function(dynamic data);

//进度回调
typedef ProgressListener = Function(double progress);

注意:

_fetchQiniuToken() 函数无需关注、主要为了获取七牛的token;

ProgressListener 用于进度回调、NetworkCompletion 用于成功后回调;

注意key的设置、此处是以文件路径+时间戳、如果key不设置 会有概率出现文件上传失败问题(报文件已存在错误);

key应该就是存储在七牛的文件名、目前还不清楚七牛是如何处理默认key(不传key)导致文件名冲突问题;

至此over!

你可能感兴趣的:(flutter,七牛云存储)