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

news2024/12/28 3:55:08

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


开始前准备:

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!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/835248.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谈谈python编程语言

目录 1.什么是python 2.python的发展历史 3.python的具体应用领域 4.就业前景 1.什么是python Python是一种高级编程语言,它具有简单易学、可读性强和功能丰富的特点。Python由Guido van Rossum于1991年开发,并成为一种通用的编程语言。 以下是一些Py…

蓝队的自我修养之如何从流量中检测 WebShell

HW期间,为防范钓鱼,即日起FreeBuf将取消投稿文章的一切外部链接。给您带来的不便,敬请谅解~ 背景 众所周知,攻防演练过程中,攻击队入侵企业网站时,通常要通过各种方式获取 webshell,从而获得企…

unity TextMeshPro 富文本

<b>粗体标签</b> <i>斜体标签</i> <u>下划线标签</u> <s>删除线标签</s> <sup>上标标签</sup>前面后边上标签 5<sup>。</sup>C <sub>下标标签&#xff0c;如&#xff1a;</sub>H<sub&…

JS进阶-Day2

&#x1f954;&#xff1a;万物皆有裂痕&#xff0c;那是光照进来的地方 JS进阶-Day1——点击此处&#xff08;作用域、函数、解构赋值等&#xff09; JS 进阶 - Day2 深入对象构造函数&#xff08;⭐&#xff09;面试小题&#xff1a; 实例成员静态成员&#xff08;⭐&#xf…

微信小程序nodejs+vue+uniapp高校食堂线上预约点餐系统

本次设计任务是要设计一个食堂线上预约点餐系统&#xff0c;通过这个系统能够满足管理员及学生的食堂线上预约点餐分享功能。系统的主要包括首页、个人中心、学生管理、菜品分类管理、菜品管理、关于我们管理、意见反馈、系统管理、订单管理等功能。 开发语言 node.js 框架&am…

【Opencv入门到项目实战】(二):图像阈值与平滑处理

文章目录 1.图像阈值处理1.1简单阈值处理&#xff08;Simple Thresholding&#xff09;1.2自适应阈值处理&#xff08;Adaptive Thresholding&#xff09;1.3Otsus阈值处理 2.平滑处理1.1均值滤波&#xff08;Mean Filter&#xff09;1.2高斯滤波&#xff08;Gaussian Filter&a…

FPGA纯verilog实现Gzip数据压缩deflate算法,提供工程源码和技术支持

目录 1、前言2、我这儿已有的FPGA压缩算法方案3、FPGA Gzip数据压缩功能和性能4、FPGA Gzip数据压缩设计方案输入输出接口描述数据处理流程LZ77压缩器哈夫曼编码输出缓存 数据输出说明特殊说明 5、vivado仿真6、vivado工程7、上板调试验证FPGA开发板测试本zip算法对比于评估 8、…

【JDK版本差异】Optional.requireNonNullElseGet在JAVA8中的替代表述

Objects.requireNonNullElseGet 是 Java 9 引入的方法&#xff0c;不在 Java 8 中可用。但是&#xff0c; 可以使用 Java 8 的一些功能来模拟类似的效果。 快速查阅 JDK9以上表述&#xff1a; this.principalFactory Objects.requireNonNullElseGet(principalFactory, Defau…

如何测出 Scratch 的指令反应时间

相信看了标题&#xff0c;你一定会很吃惊&#xff0c;你会觉得scratch不是没有反应时间吗&#xff1f; 但其实不是&#xff0c;这也是我偶然间发现的&#xff0c;这期的内容较少&#xff0c;对你的技术涨幅很小&#xff0c;但可以当作娱乐来看 其实就7个代码&#xff0c;但看着…

(自控原理)线性系统的时域分析法

目录 一、系统时间响应的性能指标 1、典型输入信号 2、动态性能与稳态性能 二、一阶系统的时域分析 1、一阶系统的数学模型 2、一阶系统的单位阶跃响应 三、二阶系统的时域分析 1、二阶系统的数学模型 2、二阶系统的单位阶跃响应 3、欠阻尼二阶系统的动态过程分析 4…

redis原理 5:同舟共济 —— 事务

为了确保连续多个操作的原子性&#xff0c;一个成熟的数据库通常都会有事务支持&#xff0c;Redis 也不例外。Redis 的事务使用非常简单&#xff0c;不同于关系数据库&#xff0c;我们无须理解那么多复杂的事务模型&#xff0c;就可以直接使用。不过也正是因为这种简单性&#…

国内版ChatGPT平替

想体验的朋友可以去微信搜索小程序 “ robot buddy ”

2024年杭州电子科技大学MEM项目招生信息全面了解

2024年全国管理类硕士联考备考已经到了最火热的阶段&#xff0c;不少考生开始持续将注意力集中在备考的规划中&#xff01;杭州达立易考教育整合浙江省内的MEM目信息&#xff0c;为大家详细梳理了相关报考参考内容&#xff0c;方便大家更好完成择校以及针对性的备考工作。本期为…

【Spring Boot】Thymeleaf模板引擎 — Thymeleaf表达式

Thymeleaf表达式 本节介绍Thymeleaf的各种表达式&#xff0c;通过一些简单的例子来演示Thymeleaf的表达式及用法。 1.变量表达式 变量表达式即获取后台变量的表达式。使用${}获取变量的值&#xff0c;例如&#xff1a; <p th:text"${name}">hello</p>…

Windows Server 2012 R2 安装 Oracle RAC 11g R2

Windows Server 2012 R2 安装 Oracle RAC 11g R2 环境准备安装系统设置虚拟网络配置虚拟机网卡开机进行系统配置关闭防火墙设置网络系统高级设置修改注册表修改计算机名称设置账户控制RAC1 和 RAC2 的磁盘共享修改 hosts同步时间在 RAC1 RAC2 DATA 中安装 .net3.5在 DATA 中搭建…

windows下redis的下载和安装

文章目录 1 下载2 打开解压文件&#xff0c;可以看到以下内容3 使用命令进行安装和注册redis到window服务4 查看服务 1 下载 https://github.com/MicrosoftArchive/redis/releases 2 打开解压文件&#xff0c;可以看到以下内容 3 使用命令进行安装和注册redis到window服务 …

一文学透设计模式——抽象工厂模式

创建者模式 抽象工厂模式 概念 抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 这是很多地方对于抽象工厂模式的描述&#xff0c;说实话感觉不是特别好懂。…

ResNet-残差网络一

文章目录 残差网络深度网络退化残差结构残差网络对比测试plain net VS residual net不同的shrotcut connection残差网络增加层数 著名的残差网络主要是在两片论文里提出&#xff1a; Deep Residual Learning for Image RecognitionIdentity Mappings in Deep Residual Networks…

yolov8在rknn(rv1109/1126)模型转换、量化移植过程

续&#xff1a;rv1109/1126 rknn 模型量化过程_CodingInCV的博客-CSDN博客 Yolov8简介 yolov8是比较新的目标检测模型&#xff0c;根据论文和开源项目的报告&#xff0c;相对使用比较广泛的yolov5提升还比较明显。 yolov8与yolov5相比&#xff0c;结构上的主要区别是将C3结构…

hutool Sm2加解密-自定义公钥私钥

代码 首先说结论&#xff0c;hutool 的SM2对象的公钥私钥是不关联的&#xff0c;你可以存自己的私钥和别人的公钥&#xff0c;这样解密的时候只要协商好就能用了&#xff0c;以下是调换公钥私钥的加解密案例 公钥格式 04公钥x公钥y //使用自定义的公钥私钥生成sm2Testpubli…