flutter开发实战-文件上传及上传队列

flutter开发实战-文件上传及上传队列

之前开发中遇到了发帖子图片上传,上传到七牛。

一、实现Dio上传

上传使用到Dio上传功能,具体代码

// 上传文件(图片)doUploadFile(String url, UploadFileInfo fileInfo,{Map<String, dynamic>? params,OnUploaded? uploaded,OnFailure? failure}) async {try {String timeStamp = DateTime.now().millisecondsSinceEpoch.toString();Map<String, dynamic> fromParams = Map();if (params != null && params.isNotEmpty) {fromParams.addAll(params);}fromParams["file"] = await MultipartFile.fromFile(fileInfo.file.path,filename: '${fileInfo.key}-${timeStamp}.jpg');FormData formData = FormData.fromMap(fromParams);Response? response = await dio.post(url, data: formData);assert(() {// assert只会在debug模式下执行,release模式下不会执行// 打印信息LoggerManager().error('''api: $url\nresult: $response''');return true;}());if (response != null) {Map<String, dynamic> result = json.decode(response.toString());assert(() {// assert只会在debug模式下执行,release模式下不会执行// 打印信息LoggerManager().debug('''api: $url\nresult: $result''');return true;}());if (response.statusCode == 200) {if (uploaded != null) {uploaded(result);}} else {//返回失败信息LoggerManager().error('''api: $url\nresult: $result''');ApiHttpError apiHttpError =ApiHttpError(ApiHttpErrorType.Default, "请求失败!");if (failure != null) {failure(apiHttpError);}}} else {//返回失败信息// 没有获得response,failureApiHttpError apiHttpError =ApiHttpError(ApiHttpErrorType.Default, "请求失败!");if (failure != null) {failure(apiHttpError);}}} on DioError catch (e, s) {// catch到异常,failureLoggerManager().error("doUploadFile api: $url, dioError:$e, s:$s");ApiHttpError apiHttpError = getRequestFailure(e.response, e.type);if (failure != null) {failure(apiHttpError);}} catch (e) {// 可以捕获任意异常ApiHttpError apiHttpError =ApiHttpError(ApiHttpErrorType.Default, "${e.toString()}");if (failure != null) {failure(apiHttpError);}}}

二、实现上传到七牛uploader_tool

上传七牛需要获取上传七牛的token

void getQiniuToken({required Function(String token) completion,required Function(ApiHttpError) failure}) {QiniuTokenRequest request = QiniuTokenRequest();GApiRepository.getQiniuToken(request: request,success: (response) async {Map<String, dynamic>? object = response.object;String token = "";if (object != null && object.isNotEmpty) {token = object["uptoken"];}if (completion != null) {completion(token);}},failure: (error) {if (failure != null) {failure(error);}},);}

调用doUploadFile实现上传

const String kQiniuUpHost = "http://up.qiniu.com";
const String kQiniuUndefinedKey = "?";
const String kQiniuUserAgent = "qiniu-ios-sdk";const String kBucket = "bucket";
const String kQiniuDomainPreUrl = "domain";void uploadImage(String imagePath, String token, {required Function(String key) completion,required Function(ApiHttpError) failure}) {String? key = StringUtils.toMD5(imagePath);String random = StringUtils.getRandom(10);String imageKey = "${key}-${random}";Map<String, dynamic> params = Map();params["bucket"] = "avatar";params["x:id"] = imageKey;params["token"] = token;params["User-Agent"] = kQiniuUserAgent;UploadFileInfo fileInfo =UploadFileInfo(file: File(imagePath), key: imageKey);HttpApi().doUploadFile(kQiniuUpHost,fileInfo,params: params,uploaded: (Map<String, dynamic> result) {String? aResultKey = result["key"];completion(aResultKey ?? "");},failure: (ApiHttpError error) {failure(error);},);}

三、实现上传队列

简单实现上传队列,这里上传采用一个接着一个上传,

代码如下

class UploaderQueue {// imagePath - keyFunction(Map<String, String> keys)? completion;Function(ApiHttpError error)? failure;UploaderQueue({this.completion,this.failure,});// 是否有任务正在进行时bool _isUploading = false;// 任务列表final List<String> _imagePathList = [];// 上传的keysfinal Map<String, String> _keyMap = {};// 上传的服务final UploaderTool _uploaderService = UploaderTool();void addImagePaths(List<String> imagePaths) {if (_isUploading) {return;}_imagePathList.addAll(imagePaths);}void doUpload() {if (_imagePathList.isEmpty) {return;}if (_isUploading) {return;}_isUploading = true;// 获取当前上传的图片ImagePathString imagePath = _imagePathList[0];_uploaderService.uploaderImage(imagePath, completion: (String key) {if (key.isNotEmpty) {_keyMap[imagePath] = key;}// 出队列_imagePathList.removeAt(0);_isUploading = false;if (_imagePathList.isNotEmpty) {// 不为空的时候doUpload();} else {if (completion != null) {completion!(_keyMap);}}}, failure: (ApiHttpError error) {cancel();if (failure != null) {failure!(error);}});}void cancel() {_isUploading = false;_imagePathList.clear();}void clear() {_isUploading = false;_imagePathList.clear();}
}

四、小结

flutter开发实战-文件上传及上传队列,获取token,上传图片到七牛。

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

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

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

相关文章

scrapy

scrapy介绍安装--架构 Scrapy 是一个爬虫框架&#xff08;底层代码封装好了&#xff0c;只需要在固定位置写固定代码即可&#xff09;&#xff0c;应用领域比较广泛---》爬虫界的django# 安装 #Windows平台1、pip3 install wheel #安装后&#xff0c;便支持通过wheel文件安装软…

c#调用cpp库,debug时不进入cpp函数

选中c#的项目&#xff0c;右击属性&#xff0c;进入属性页&#xff0c;点击调试&#xff0c;点击打开调试启动配置文件UI&#xff0c;打开启用本机代码调试。

相机标定学习笔记

Kalibr 是标定工具中&#xff0c;唯一一个可以标定camToImu的&#xff0c;是vio必不可少的工具&#xff0c;其他的都有替代品。所以学习多种开源算法进行相机标定&#xff0c;并记录学习相机标定的过程。 一、相机标定 1、在场景中放置一个已知的物体 &#xff08;1&#xff…

初探 Seaborn:Python 数据可视化入门

Seaborn 是一个基于 Matplotlib 的 Python 数据可视化库&#xff0c;它提供了更高级别的接口&#xff0c;使得创建美观的统计图形变得非常简单。在这篇文章中&#xff0c;我们将讨论 Seaborn 的基础使用方法&#xff0c;包括如何创建各种常见的统计图形。 一、安装和导入 Seab…

MySQL的四种主要存储引擎

目录 &#xff08;一&#xff09;MyISAM &#xff08;二&#xff09;InnoDB 1)自动增长列&#xff1a; 2)外键约束&#xff1a; &#xff08;三&#xff09;MEMORY &#xff08;四&#xff09;MERGE 什么是存储引擎&#xff1f; 对MySQL来说&#xff0c;它提供了存储不…

【wifi模块选型指导】数据传输WiFi模块的选型参考_USB/UART接口WiFi模块

数据传输WiFi模块有USB接口和UART接口两大类&#xff0c;为满足行业客户的不同应用需求&#xff0c;SKYLAB研发推出了多款2.4GHz单频&#xff0c;2.4/5GHz双频的USB接口WiFi模块和UART接口WiFi模块&#xff0c;数据传输能力&#xff0c;传输距离各有不同。怎么选才是最适合的呢…

基于ResNet50算法实现图像分类识别

概要 在本文中将介绍使用Python语言&#xff0c;基于TensorFlow搭建ResNet50卷积神经网络对四种动物图像数据集进行训练&#xff0c;观察其模型训练效果。 一、目录 ResNet50介绍 图片模型训练预测 项目扩展 二、ResNet50介绍 ResNet50是一种基于深度卷积神经网络&#xff…

性能测试需求分析怎么做?(中)

本系列文章我们为大家系统地介绍一下性能测试需求分析&#xff0c;让大家全面掌握性能测试的第一个环节。本系列文章将会从性能测试需求分析整体概述、性能测试需求分析内容、性能测试需求分析方法这三个方面进行展开。在&#xff08;上&#xff09;部分中&#xff0c;我们为大…

238. 除自身以外数组的乘积

题目描述&#xff1a; 主要思路&#xff1a; 正逆各扫一遍&#xff0c;利用数组存储当前数左边和右边的乘积。 class Solution { public:vector<int> productExceptSelf(vector<int>& nums) {int nnums.size();vector<int> ans;int l[n1],r[n1];l[0]1,…

打家劫舍问题

你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个房屋存放金额的…

python将dataframe数据导入MongoDB非关系型数据库

文章目录 pymongo连接新建数据库和集合pandas导入数据插入数据数据查看 pymongo连接 import pymongo client pymongo.MongoClient("mongodb://localhost:27017/") dblist client.list_database_names() for db in dblist:print(db) #查看已有数据库admin bilibil…

算法设计方法之贪心算法

贪心算法 介绍 贪心算法是算法设计的一种方法。期盼通过每个阶段的局部最优选择&#xff0c;从而达到全局的最优。但结果不一定是最优的。 基础案例 场景一 零钱兑换 现有硬币 1 元、2 元、5 元&#xff0c;需要用最少的硬币数量凑够 11 元。 利用贪心算法实现&#xff…

【微信小程序】实现点击+号弹出一个附着旁边的弹窗进行多个方式的选择

在微信小程序中&#xff0c;你可以使用小程序的组件和事件来实现点击号弹出一个附着在号旁边的弹窗&#xff0c;以进行多个方式的选择。以下是一个示例代码&#xff1a; 在wxml文件中&#xff0c;创建一个按钮&#xff0c;并为按钮绑定一个点击事件&#xff1a; <view cla…

【kubernetes系列】kubernetes之计算资源管理

资源类型 在 Kubernetes 中&#xff0c;Node 提供资源&#xff0c;而 Pod 使用资源。其中资源分为计算&#xff08;CPU、Memory、GPU&#xff09;、存储&#xff08;Disk、SSD&#xff09;、网络&#xff08;Network Bandwidth、IP、Ports&#xff09;。这些资源提供了应用运行…

开启了代理,但是git仍然连接拒绝的解决方法

开启了代理&#xff0c;但是git仍然连接拒绝的原因&#xff1a; windows 中 git 默认不会使用系统代理&#xff0c;所以即使连接代理或者打开代理软件&#xff0c;浏览器仍然可以访问 GitHub 或 Gitee&#xff1b;但是使用 git 命令行连接 GitHub 或 Gitee 远程仓库可能会出现…

【LLM】Langchain使用[二](模型链)

文章目录 1. SimpleSequentialChain2. SequentialChain3. 路由链 Router Chain Reference 1. SimpleSequentialChain 场景&#xff1a;一个输入和一个输出 from langchain.chat_models import ChatOpenAI #导入OpenAI模型 from langchain.prompts import ChatPromptTempla…

自动化测试之数据驱动与关键字驱动

目录 1.录制/回放的神话 2.数据驱动的自动化测试框架 3.关键字驱动的自动化测试 初次接触自动化测试时&#xff0c;对数据驱动和关键字驱动不甚理解&#xff0c;觉得有点故弄玄须&#xff0c;不就是参数和函数其嘛&#xff01;其实其也体现了测试所不同与开发的一些特点&…

目标检测——R-CNN网络基础

目录 Overfeat模型RCNN模型算法流程候选区域生成CNN网络提取特征目标分类&#xff08;SVM&#xff09;目标定位预测过程 算法总结 Fast RCNN模型算法流程ROI Pooling目标分类和回归 模型训练模型总结 Overfeat模型 RCNN模型 算法流程 候选区域生成 CNN网络提取特征 目标分类&am…

机器学习1

核心梯度下降算法&#xff1a; import numpy as np from utils.features import prepare_for_trainingclass LinearRegression:def __init__(self,data,labels,polynomial_degree 0,sinusoid_degree 0,normalize_dataTrue):"""1.对数据进行预处理操作2.先得到…

Python-Web框架flask使用

目录 1.Web框架 1.1 flask 1.1.1 debug调试 1.1.2 定义参数web服务 获取字符串 ​编辑 1.1.3 html网页渲染 1.13.1 带参数传给网页文件 普通元素 列表元素 字典元素 1.Web框架 1.1 flask python的web框架&#xff0c;目录结构如下&#xff1a; 1.static存放的是css,…