flutter开发 - 七牛云上传sdk插件qiniu_flutter_sdk使用

flutter七牛云上传sdk插件qiniu_flutter_sdk使用
最近在拆分代码,将上传组件设置成插件,下面记录下实现过程。

一、创建flutter_plugin上传插件

这里Android Studio使用创建plugin

填写一下信息

  • Project name
  • Project location
  • Description
  • Project type
  • Organization
  • Android Language
  • iOS Language
  • Platforms

flutter开发 - 七牛云上传sdk插件qiniu_flutter_sdk使用_第1张图片

二、代码实现

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';

学习记录,每天不停进步。

你可能感兴趣的:(移动开发,flutter,flutter,插件,组件)