• 【axios】axios下载二进制excel文件如何做到中断续传


    使用 Axios 来下载二进制 Excel 文件并实现中断和续传。以下是一种基本的实现方法:

    1、在开始下载之前,确保您的项目中已经使用了 Axios(可以通过使用 npm 或者 yarn 进行安装)。

    2、创建一个用于下载的函数,并使用 axios.get() 来发起文件下载请求。如下所示:

    const axios = require('axios');
    const fs = require('fs');
    
    // 下载函数
    async function downloadExcelFile(url, outputPath, headers = {}) {
      const writer = fs.createWriteStream(outputPath, { flags: 'a' });
      
      const response = await axios.get(url, {
        responseType: 'stream',
        headers,
      });
    
      response.data.pipe(writer);
    
      // 返回一个 Promise,以便在外部处理下载过程
      return new Promise((resolve, reject) => {
        writer.on('finish', resolve);
        writer.on('error', reject);
      });
    }
    
    // 调用下载函数
    downloadExcelFile('http://example.com/excel-file.xls', 'output.xls')
      .then(() => {
        console.log('文件下载完成');
      })
      .catch((error) => {
        console.error('文件下载失败', error);
      });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    3、在现有的下载函数中添加中断和续传的支持,可以使用 range 请求头来控制请求的块位置。修改下载函数如下:

    const axios = require('axios');
    const fs = require('fs');
    
    // 下载函数
    async function downloadExcelFile(url, outputPath, headers = {}) {
      let startByte = 0;
    
      if (fs.existsSync(outputPath)) {
        // 如果已经存在输出文件,则获取已下载的文件大小
        const stats = fs.statSync(outputPath);
        startByte = stats.size;
    
        // 通过设置 Range 请求头来指定从哪个位置继续下载
        headers['Range'] = `bytes=${startByte}-`;
      }
    
      const writer = fs.createWriteStream(outputPath, { flags: 'a' });
    
      const response = await axios.get(url, {
        responseType: 'stream',
        headers,
      });
    
      response.data.pipe(writer);
    
      // 返回一个 Promise,以便在外部处理下载过程
      return new Promise((resolve, reject) => {
        writer.on('finish', resolve);
        writer.on('error', reject);
      });
    }
    
    // 调用下载函数
    downloadExcelFile('http://example.com/excel-file.xls', 'output.xls')
      .then(() => {
        console.log('文件下载完成');
      })
      .catch((error) => {
        console.error('文件下载失败', error);
      });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    通过以上修改,下载函数将会检查是否已存在输出文件。如果存在,则使用 Range 请求头指定从已下载的文件大小开始继续下载,实现了中断和续传的功能。

    请注意,服务器必须支持并正确处理 Range 请求头,同时确保文件内容正确的传输和续传。确保服务器端已正确设置了响应头信息。前端的断点续传实际上是基于服务器端的支持和协议的。

  • 相关阅读:
    AndroidStudio配置adb环境变量和adb的使用
    Array.from()的使用方法(数组去重,伪数组转为数组,数组浅克隆),Set和Map数据结构
    kubernetes之Deployment
    Linux中系统定时任务
    Python常见的数据分析工具有哪些?
    我的创作纪念日
    淘宝/天猫API:item_sku-获取sku详细信息
    【负载均衡+动静分离】Nginx 和 Tomcat 的负载均衡&动静分离配置
    一个小型公司怎么落地微服务
    一文看懂微信小程序新版隐私协议(附带弹窗组件)
  • 原文地址:https://blog.csdn.net/hzxOnlineOk/article/details/133087091