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

news/2024/7/24 12:14:46 标签: javascript, 上传下载进度

发起请求的方式有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>javascript">
    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.niftyadmin.cn/n/332939.html

相关文章

Windows上配置访问共享

Windows上配置访问共享 方法一&#xff1a;FTP共享方法二&#xff1a;文件共享 方法一&#xff1a;FTP共享 参考该链接&#xff1a;https://blog.csdn.net/qq_41101213/article/details/94214121 方法二&#xff1a;文件共享 本案例是在windows防火墙开启的状态下配置的 给本…

Redis学习---02

一、Redis基础知识 (1)redis默认有16个数据库;默认使用的是第0个数据库&#xff1b;切换数据库&#xff1a; select index 获取数据库中的值大小&#xff1a;dbsize (2)&#xff1a;查看所有的key (3):清空当前数据库&#xff1a;flushdb (4)清空所有的数据库&#xff1a;flu…

Java 与数据结构(6):图

一、图 图是一种非常重要的数据结构&#xff0c;在计算机科学和网络科学中被广泛应用。图由节点&#xff08;顶点&#xff09;和边组成&#xff0c;节点表示实体&#xff0c;边表示实体之间的关系。图可以用来描述各种复杂的关系&#xff0c;如社交网络、路线图、组织结构等。…

Postman调试依赖登录接口的3种方法

在接口测试种, 我们经常会遇到有些接口登录后才能访问.我们在使用Postman调试这种接口时一般有3种方法: 1.依次请求 如果有登录接口的文档,或者通过抓包比较容易抓出登录请求的参数和格式,可以先使用Postman请求一下登录接口,这时Cookies会存到本地(可以通过Postman Cookies管理…

free命令 – 显示系统内存使用量情况

Linux free命令详解 在Linux系统中&#xff0c;free命令是一个非常有用的工具&#xff0c;它可显示系统内存使用量情况&#xff0c;帮助我们监控系统资源。本文将介绍free命令的语法、实操和使用该命令输出各种内存使用量数据的最佳方法 1. 命令语法 free命令的基本语法如下…

Jenkins持续集成之jenkins安装入门教学

Jenkins安装 1、下载jenkins&#xff1b;官方地址&#xff1a;https://www.jenkins.io/ 2、点击Download 3、下载windows版本的安装包后缀为msi&#xff1b; 4、双击安装&#xff1b;如下图 5、安装到指定的盘&#xff1b;再点击next 6、勾选第一个框&#xff1b;再点击next 7…

网络安全真的那么好吗?

近几年&#xff0c;随着网络安全被列为国家安全战略的一部分&#xff0c;这个曾经细分的领域发展提速了不少&#xff0c;除了一些传统安全厂商以外&#xff0c;一些互联网大厂也都纷纷加码了在这一块的投入&#xff0c;随之而来的吸引了越来越多的新鲜血液不断涌入。 网络安全…

react中hook的作用和用处

当React 16.8发布时&#xff0c;一个全新的功能被加入了React库 - Hook(钩子)。Hook是一种函数&#xff0c;它可以让你在函数组件中“挂钩”到React状态和生命周期等特性。通过使用Hook&#xff0c;您可以更轻松地编写复杂的函数组件&#xff0c;并且能够重用代码逻辑。 1. us…