js文件上传和下载的进度处理

news2024/9/21 12:33:53

发起请求的方式有AxiosXMLHttpRequestFetch

Axios

在这里插入图片描述

Axios下载进度演示-onDownloadProgress

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="https://unpkg.com/axios@1.4.0/dist/axios.min.js"></script>
</head>
<body>
  <button id="btn">下载</button>
  <script>
    document.querySelector('#btn').addEventListener('click', () => {
      axios({
        method: 'get',
        url: 'https://picture-bed.pek3b.qingstor.com/picture-bed-2023-05-04/202305160908424.png',
        responseType: 'blob',
        onDownloadProgress: (e) => {
          console.log(e)
        }
      }).then(res => {
        console.log(res)
      })
    })
  </script>
</body>
</html>

在这里插入图片描述
onDownloadProgress中,totalloaded分别表示文件的大小和已下载文件的大小,那么下载的进度值就可以为parseFloat((e.loaded / e.total * 100).toFixed(2))

Axios上传进度展示-onUploadProgress

document.querySelector('#btn').addEventListener('click', () => {
      axios({
        method: 'post',
        url: '/api/upload',
        onUploadProgress: (e) => {
          console.log(e)
        }
      }).then(res => {
        console.log(res)
      })
    })

在这里插入图片描述
onUploadProgress中,totalloaded分别表示文件的大小和已上传文件的大小,那么上传的进度值就可以为parseFloat((e.loaded / e.total * 100).toFixed(2))

注意:progressEvent下total的值如果为0,查看下载接口中响应头的ContentLength字段是否有返回。该值需要后端人员在接口的响应头中添加

在这里插入图片描述

直接使用定时器展示进度条


startTimer() {
   this.intervalId = setInterval(() => {
     // 每 1s 执行一次函数
     if (this.modal.percent < 90) {
       // 如果 percentage 值小于 100,则自增 1
       this.modal.percent = parseFloat((this.modal.percent + 1.8).toFixed(1));
     } else {
       // 如果 percentage 值达到 100,则停止计时器
       clearInterval(this.intervalId);
     }
   }, 100);
 },
// 1.8是如何计算出来的,预估接口请求大概需要5s,5/0.1 = 50, 90/50 = 1.8
// 等接口数据返回成功后让进度值为100,并清除定时器
this.modal.percent = 100;
clearInterval(this.intervalId);

XMLHttpRequest进度处理-opprogress


    function ajax (url, method, progressCallback, body, headers) {
      return new Promise((resolve, reject) => {
        let request = new XMLHttpRequest()
        request.open(method, url) // 初始化一个请求
        for (let key in headers) {
          request.setRequestHeader(key, headers[key]) // 设置HTTP请求头部的方法,该方法必须在 open()之后,send() 之前调用
        }
        // 进度事件处理
        request.onprogress = (e) => {
          progressCallback(e)
        }
        request.onreadystatechange = () => {
          // debugger
          if (request.readyState === 4) {
            if (request.status === 200 || request.status === 304) {
              resolve(request.responseText) // request.responseText 是一个字符串,需要 JSON.parse() 转换
            } else {
              reject(request)
            }
          }
        }

        request.send(body) // 发送http请求
      })
    }

    document.querySelector('#btn').addEventListener('click', () => {
      ajax(
        'https://picture-bed.pek3b.qingstor.com/picture-bed-2023-05-04/202305160908424.png',
        'get',
        (e) => {
          console.log(e)
        }
        ).then(res => {
      })
    })

在这里插入图片描述

​fetch​ 方法允许去跟踪 下载 进度,fetch 方法无法跟踪 上传 进度。

fetch下载进度处理

document.querySelector('#btn').addEventListener('click', async () => {
      // Step 1:启动 fetch,并获得一个 reader
      let response = await fetch('https://picture-bed.pek3b.qingstor.com/picture-bed-2023-05-04/202305160908424.png');

      const reader = response.body.getReader();

      // Step 2:获得总长度(length)
      const contentLength = +response.headers.get('Content-Length');

      // Step 3:读取数据
      let receivedLength = 0; // 当前接收到了这么多字节
      let chunks = []; // 接收到的二进制块的数组(包括 body)
      while(true) {
        const {done, value} = await reader.read();

        if (done) {
          break;
        }

        chunks.push(value);
        receivedLength += value.length;

        console.log(`Received ${receivedLength} of ${contentLength}`)
      }

      // Step 4:将块连接到单个 Uint8Array
      let chunksAll = new Uint8Array(receivedLength); // (4.1)
      let position = 0;
      for(let chunk of chunks) {
        chunksAll.set(chunk, position); // (4.2)
        position += chunk.length;
      }

      // Step 5:解码成字符串
      let result = new TextDecoder("utf-8").decode(chunksAll);

      // 我们完成啦!
      console.log(result)
    })

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

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

相关文章

【zmq】zguide和cppzmq及windows测试程序

官方的zguide还是有更新的c++例子zguide构建的工程没更新 官方文档说支持3.2   Updated and revised for ZeroMQ/3.2 (older text for ZeroMQ/2.2 still available).libzmq 本身是c++实现的 我现在的libzmq版本是4.3.4,头文件#include <zmq.hpp>

STM32开发(十九)STM32F103 数据手册 —— 低功耗模式解析

文章目录 低功耗介绍stm32 供电框图低功耗模式睡眠模式停止模式待机模式低功耗模式汇总低功耗介绍 系统复位或上电复位后,微控制器进入运行模式。在运行模式下,CPU通过HCLK提供时钟,并执行程序代码。 系统提供多种低功耗模式,可以在CPU不需要运行时进入低功耗模式节省功耗…

一看就会的React入门

目录 简介 入门案例 直接创建 函数式创建 类实例创建 组件实例三大核心属性 state 代码演示 props refs 简介 1). Facebook开源的一个js库 2). 一个用来动态构建用户界面的js库 3). React的特点 Declarative(声明式编码) Component-Based(组件化编码) Le…

生物医学神经网络的方向感

文章目录 A Sense of Direction in Biomedical Neural Networks摘要本文方法Rotation Mechanism 实验结果 A Sense of Direction in Biomedical Neural Networks 摘要 本文描述了一种使模型不仅知道强度&#xff0c;还知道特征方向和尺度等特性的方法。当分析包含诸如血管或纤…

PID单环控制(位置环)

今天我们来聊一聊pid如果控制轮子转动位置 前期准备调试过程 前期准备 需要准备的几个条件&#xff1a; 1.获取实时编码器的计数值 2.写好pid控制算法的函数 3.设定好时间多久执行一次pid计算&#xff0c;并设置限幅输出。 4.多久执行一次pid输出 接下来我们看看这几个部分的…

Vue(ajax、插槽)

一、ajax请求 1. 实现ajax请求方式&#xff1a; xhr&#xff1a;原生 jquery封装xhr axios&#xff1a;属于promise fetch 2. axios实现步骤&#xff1a; 1.首先安装axios //安装 npm i axios 2. 在本地准备两个服务端 //student const express require(express) const a…

一级缓存和二级缓存问题

介绍 MyBatis 中的缓存&#xff0c;主要分为一级缓存和二级缓存。 一级缓存是 SqlSession 级别的缓存&#xff0c;也叫本地缓存。当执行一个 SqlSession 的查询时&#xff0c;查询到的结果会被保存在 SqlSession 的缓存中。同一个 SqlSession 内执行相同的 SQL 语句&#xff…

C语言CRC-16 CCITT-FALSE格式校验函数

C语言CRC-16 CCITT-FALSE格式校验函数 CRC-16校验产生2个字节长度的数据校验码&#xff0c;通过计算得到的校验码和获得的校验码比较&#xff0c;用于验证获得的数据的正确性。基本的CRC-16校验算法实现&#xff0c;参考&#xff1a; C语言标准CRC-16校验函数。 不同应用规范…

【MySQL】浅谈事务

哈喽&#xff0c;大家好~我是你们的老朋友&#xff1a;保护小周ღ 谈起 “事务”&#xff0c;可能大家都会在心中出现一个大大的 &#xff1f;&#xff0c;博主的理解——事务就是解决 MySql数据库在应对多线程环境下针对同一存储空间的数据修改引起的数据安全问题的一种机制…

JMeter入门配置

目录 场景&#xff1a; 环境及工具 &#xff1a; JMeter中文配置&#xff1a; 配置登录接口&#xff1a; 配置响应结果&#xff1a; 配置json提取器 测试json提取器 配置Beanshell后置处理器&#xff1a; http请求右键-->添加---->后置处理器--->Beanshell后置处理…

pta(浙大第四版)五道经典练习题②

目录 ①、递归正序输出整数 ②、递归逆序整数并返回 ③、递归实现十进制转二进制 ④、英语单词排序&#xff08;​编辑&#xff09; ⑤、输出月份英文名 ①、递归正序输出整数 题述&#xff1a;给一个正整数n&#xff0c;请利用递归按顺序输出它的每位数&#xff0c;输出一…

【NovelAI 小说SD批量生成 文生图/视频克隆】环境配置和使用方法

【样品】《谜影之夜》文生图全自动版SD一键成片 操作步骤&环境配置地址&#xff1a; 【NovelAI】月产10000全自动批量原创小说短视频支持文生图和视频克隆 该文章面向购买脚本的付费用户&#xff0c;提供所有问题以及解决办法。使用 notepad 打开对应的文件即可&#xff0c…

深度学习部署(Pytorch+windows)

目录 NVIDA GPU驱动 NVIDA GPU驱动 查看电脑显卡类型&#xff08;电脑——属性——设备管理器——显示适配器&#xff09; 进入NVIDA官方网站&#xff08;官方驱动 | NVIDIA&#xff09;下载对应驱动&#xff0c; 接下来默认安装即可。 安装完成之后&#xff0c;查看自己的…

GitHub项目免费教你提示工程,全中文教学,小白也能懂

转载自 | 量子位 量子位 | 公众号 QbitAI 这个GitHub开源项目&#xff0c;打算手把手教你成为一名提示工程师。 理论与实例结合&#xff0c;浅显易懂&#xff0c;可以免费学习&#xff0c;关键还是中文&#xff01; 如果觉得GitHub界面看起来不方便&#xff0c;还可以到搭建…

文心领航走进大模型时代,从Q1财报看百度价值重估机遇

大模型风头不减&#xff0c;真正的“灵魂选手”在此刻交出了一季度成绩单&#xff0c;让市场看到了“AI巨头”的本色。 北京时间5月16日美股盘前&#xff0c;百度发布了2023Q1财报。财报显示&#xff0c;其营收和利润双双超市场预期&#xff0c;整体经营质量大幅度提高。在经济…

基于卷积的图像分类识别(四):GoogLeNet (V1~V4 Xception)

本专栏介绍基于深度学习进行图像识别的经典和前沿模型&#xff0c;将持续更新&#xff0c;包括不仅限于&#xff1a;AlexNet&#xff0c; ZFNet&#xff0c;VGG&#xff0c;GoogLeNet&#xff0c;ResNet&#xff0c;DenseNet&#xff0c;SENet&#xff0c;MobileNet&#xff0c…

JavaWeb学习-MyBatis-入门

JavaWeb学习-MyBatis-入门 快速入门准备工作配置Mybatis(数据库连接)编写程序mappertest 配置SQL提示JDBC介绍概述案例 数据库连接池概述连接池切换Druid连接池 lombok工具介绍maven坐标案例 来源 快速入门 准备工作 创建SpringBoot工程 数据库表usercreate table user (id …

flume 进阶 自定义source(十)

需求 每隔五秒输出5次数据 pom文件 <dependencies><dependency><groupId>org.apache.flume</groupId><artifactId>flume-ng-core</artifactId><version>1.9.0</version></dependency></dependencies>代码 pac…

NETALAND惊艳上线,平行云助力元宇宙大玩家网易闪亮登场

近日&#xff0c;网易传媒旗下全新的泛娱乐体验空间NETALAND惊艳上线。NETALAND以其近乎于电影质感的场景&#xff0c;趣味的互动模式&#xff0c;流畅、沉浸的交互体验&#xff0c;给营销行业带来了一份新答卷。 NETALAND整合了网易传媒强大的元宇宙技术和丰富的内容生态&…

【Jenkins】新手安装、运行Jenkins(详细教学)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、…