当前位置: 首页 > news >正文

前端结合 react axios 获取真实下载、上传进度

首页确保项目中使用了axios

axios ondownloadprogress中total总为零,content-length不返回?

点我查看 Axios Documention

 npm i axios
 yarn add axios

以下我们举例接口调用配置说明:

由于接口下载时,不确定文件下载时长,所以直接设置不限时

 timeout: -1,

由于 axios 已提供下载上传回掉函数(callback),所以我们直接调用就好

import { useState } from "react"type ProgressStatusType = "normal" | "active" | "success" | "exception"interface TestReportState {showProgressModal: booleandownloadPercent: numberdownloadStatus: ProgressStatusType
}const [showProgressModal,setShowProgressModal] = useState<boolean>(false)
const [downloadPercent,setDownloadPercent] = useState<number>(0)
const [downloadStatus,setDownloadStatus] = useState<ProgressStatusType>("normal")// 外层调用
const downloadFile = async (filename: string): Promise<void> => {try {setShowProgressModal(true)setDownloadStatus("active")const res = await downLoadFileTemp({ filename }, state)setDownloadStatus("success")downloadFileAction(filename, res)} catch (error) {setDownloadStatus("exception")console.error("downloadFile->", error)}
}export const downLoadFile = (params: { filename: string }, setDownloadPercent:()=>void ): Promise<Blob> => {return get(`api/getFile?${qs.stringify(params)}`, {timeout: -1, // 不限时onDownloadProgress: (progressEvent: ProgressEvent) => {setDownloadPercent(calcProgress(progressEvent)) },onUploadProgress:  (progressEvent: ProgressEvent) => {// Do whatever you want with the Axios progress event},})
}

为了提高代码互用性与可维护性所以将计算进度的逻辑做了封装

/*** 计算进度条百分比*/
export const calcProgress = (progressEvent: ProgressEvent): number => {const { loaded = 0, total = 0 } = progressEvent || {}return Math.ceil((loaded / total) * 100) || 0
}

你可能有疑惑 progressEvent 中所含有的字段,请看以下示例:


/*** Events measuring progress of an underlying process, like an HTTP request (for an XMLHttpRequest, or the loading of the underlying resource of an <img>, <audio>, <video>, <style> or <link>).** [MDN Reference](https://developer.mozilla.org/docs/Web/API/ProgressEvent)*/
interface ProgressEvent<T extends EventTarget = EventTarget> extends Event {/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/ProgressEvent/lengthComputable) */readonly lengthComputable: boolean;/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/ProgressEvent/loaded) */readonly loaded: number;readonly target: T | null;/** [MDN Reference](https://developer.mozilla.org/docs/Web/API/ProgressEvent/total) */readonly total: number;
}

axios ondownloadprogress中total总为零,content-length不返回?

  1. 后端在header中加上content-length
  2. 如果使用了Gzip做了文件分块获取到的 content-length 也可能是不准确的,所以可以让后端将此信息新建一个字段解决 例如:
response header {...custom-content-length: 2040
}

相关文章:

  • Vue3学习日记 Day4 —— pnpm,Eslint
  • 【C++】vector容器初步模拟
  • python初始化二维数据
  • 实体框架EF(Entity Framework)简介
  • linux之shell脚本基础
  • DEYOv2: Rank Feature with Greedy Matchingfor End-to-End Object Detection
  • 无线局域网——wlan
  • 【Python 48小时速成 8】函数
  • Spring如何解决循环依赖?
  • macOS 通过 MacPorts 正确安装 MySQL 同时解决无法连接问题
  • postgresql查看数据库占用空间大小
  • 《如何使用C语言去下三子棋?》
  • qt+ffmpeg 实现音视频播放(二)之音频播放
  • 【UE5】动画蒙太奇简述
  • K8S日志收集方案-EFK部署
  • 【Linux系统编程】快速查找errno错误码信息
  • 03Go 类型总结
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • angular学习第一篇-----环境搭建
  • ECMAScript6(0):ES6简明参考手册
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JavaScript服务器推送技术之 WebSocket
  • JavaScript类型识别
  • spring cloud gateway 源码解析(4)跨域问题处理
  • SQLServer之索引简介
  • zookeeper系列(七)实战分布式命名服务
  • 开源地图数据可视化库——mapnik
  • 聊聊redis的数据结构的应用
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (1) caustics\
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (bean配置类的注解开发)学习Spring的第十三天
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (二)fiber的基本认识
  • (附源码)php投票系统 毕业设计 121500
  • (三)终结任务
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET 5种线程安全集合
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET Core 项目指定SDK版本
  • .NET Core引入性能分析引导优化
  • .NET大文件上传知识整理
  • // an array of int
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @Valid和@NotNull字段校验使用
  • [Angular 基础] - 表单:响应式表单
  • [BZOJ3757] 苹果树
  • [C#][DevPress]事件委托的使用
  • [C++][基础]1_变量、常量和基本类型
  • [C++]unordered系列关联式容器