前端大文件下载(带进度条)

  • 1.需求背景
  • 2.需求分析:
  • 3.实现方式
  • 4.实现方式解析
    • 1.递归调用接口获取数据流(base64/blob),我这里后端接口返回的是base64;
    • 2.后端对文件进行切片处理,接口返回流数据和总切片数以及当前的切片索引,前端进行进度计算,和流数据整合;
    • 3.注意,不能对接收的base64数据流直接字符串拼接,否则会报错(Invalid string length),字符串长度超过了 JS 引擎的限制,那么这个长度限制到底是多少呢?根据搜索到的结果,V8 引擎支持的字符串长度为 2 的 29 次方,换算成内存量约为 512 MB;
    • 4.解决办法,以数组的方式,进行保存
    • 5.循环数组,把每一个切片base64数据转成Blob格式
    • 6.调用file-saver的saveAs的api实现下载
  • 5.可优化点
    • 增加暂停/继续、取消按钮对进度条进行控制,实现断点续传;

1.需求背景

前端页面实现大文件(G级别以上)下载,压缩文件格式(tar包), 显示下载进度

2.需求分析:

如果页面上实现一个点击下载的功能,传统做法:
1.是使用一个 a 标签,然后将该标签的 href 属性地址指向下载文件在服务端的地址,增加download属性(同域);
2. location.href直接赋值(如果该文件能在浏览器上打开,那么就直接打开)
以上两种方法不做过多介绍,本文章主要是通过对文件进行切片传输,以流的形式返回给前端,前端进行整合实现下载

3.实现方式

import {saveAs} from ‘file-saver’;

 点击下载的函数(递归实现)async downloadLog(val: Row) {const requestHandle = async () => {const params = {date,number: val.packageNum  // 当前的切片索引};let {context, flag, total} = await this.fetchLogDownloadAction(params);val.dataStream.push(`${context}`); // 文件内容(base64)val.progress = ((++val.packageNum / total) * 100).toFixed(0); // 进度的百分比展示if (flag === 1) {// 最后一包val.packageNum = 0;this.saveFileDownload(val);} else if (flag === 0) {this.$nextTick(() => {requestHandle();});}};requestHandle();}
 流文件保存本地并下载async saveFileDownload(val: Row) {let arrBlob: any[] = [];val.dataStream.forEach((ele: string) => {var bstr = atob(ele),n = bstr.length,u8arr = new Uint8Array(n);while (n--) {u8arr[n] = bstr.charCodeAt(n);}arrBlob.push(u8arr);});let saveFile = new Blob(arrBlob, {type: 'application/x-tar'});saveAs(saveFile, val.date);val.dataStream = [];}

4.实现方式解析

1.递归调用接口获取数据流(base64/blob),我这里后端接口返回的是base64;

2.后端对文件进行切片处理,接口返回流数据和总切片数以及当前的切片索引,前端进行进度计算,和流数据整合;

3.注意,不能对接收的base64数据流直接字符串拼接,否则会报错(Invalid string length),字符串长度超过了 JS 引擎的限制,那么这个长度限制到底是多少呢?根据搜索到的结果,V8 引擎支持的字符串长度为 2 的 29 次方,换算成内存量约为 512 MB;

4.解决办法,以数组的方式,进行保存

5.循环数组,把每一个切片base64数据转成Blob格式

6.调用file-saver的saveAs的api实现下载

5.可优化点

增加暂停/继续、取消按钮对进度条进行控制,实现断点续传;

前端大文件下载(带进度条)相关推荐

  1. python 全栈开发,Day36(作业讲解(大文件下载以及进度条展示),socket的更多方法介绍,验证客户端链接的合法性hmac,socketserver)...

     先来回顾一下昨天的内容 黏包现象 粘包现象的成因 : tcp协议的特点 面向流的 为了保证可靠传输 所以有很多优化的机制 无边界 所有在连接建立的基础上传递的数据之间没有界限 收发消息很有可能不完全 ...

  2. 036_python的大文件下载以及进度条展示

    复习 1.黏包现象 粘包现象的成因: tcp协议的特点,面向流的,为了保证可靠传输,所以有很多优化的机制. 无边界 所有在连接建立的基础上传递的数据之间没有界限. 收发消息很有可能不完全相等. 缓存机 ...

  3. php - 基于 webuploader 视频大文件分片分段上传,支持断点续传(刷新、关闭页面、重新上传、网络中断等情况)带进度条,前端后端都有示例源码详细教程

    效果图 文件上传前先检测该文件是否已上传,如果已上传提示 "文件已存在",如果未上传则直接上传. 基于 php+webuploader的大文件分片上传,带进度条,支持断点续传(刷新 ...

  4. php带截切图片上传_PHP大文件切割上传并带进度条功能示例

    本文实例讲述了PHP大文件切割上传并带进度条功能.分享给大家供大家参考,具体如下: 前面一篇介绍了PHP大文件切割上传功能,这里再来进一步讲解PHP大文件切割上传并带进度条功能. 项目结构图: 14- ...

  5. 带进度条的ASP无组件断点续传下载代码

    <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <%Option Explicit%> <% '= ...

  6. ASP无组件上传带进度条

    <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <%Option Explicit%> <% '= ...

  7. 【MFC】带进度条的状态栏

    00. 目录 文章目录 00. 目录 01. 案例概述 02. 开发环境 03. 关键技术 04. 程序设计 05. 秘笈心法 06. 源码下载 07. 附录 01. 案例概述 状态栏多用于显示程序执 ...

  8. php 异步进度条,PHP学习:PHP+Ajax异步带进度条上传文件实例

    <PHP学习:PHP+Ajax异步带进度条上传文件实例>要点: 本文介绍了PHP学习:PHP+Ajax异步带进度条上传文件实例,希望对您有用.如果有疑问,可以联系我们. PHP应用前端引入 ...

  9. 从FTP下载文件带进度条

    1 #region 获取FTP服务器上指定文件的大小 2 /// <summary> 3 /// 获取FTP服务器上指定文件的大小 4 /// </summary> 5 /// ...

  10. java mvc上传文件进度_java相关:springMVC+ajax实现文件上传且带进度条实例

    java相关:springMVC+ajax实现文件上传且带进度条实例 发布于 2020-7-5| 复制链接 本篇文章主要介绍了springMVC+ajax实现文件上传且带进度条实例,具有一定的参考价值 ...

最新文章

  1. docker容器运行mysql持久化_docker容器实现数据持久化的两种方式及其区别
  2. R语言ggplot2可视化绘制分组水平并行条形图(bar plot)并为条形图内添加标签
  3. gcc for Windows 开发环境介绍
  4. mysql自增变量插入行时需要赋值
  5. URL URI傻傻分不清楚,dart告诉你该怎么用
  6. 有关 !DOCTYPE HTML
  7. 【读书笔记《Android游戏编程之从零开始》】2.Hello,World!
  8. 计算机网络(北京理工大学出版社)课后习题答案
  9. SIP呼叫流程——现代交换原理实验四
  10. java ognl表达式_ognl 详解 Struts2中的OGNL表达式 | 学步园
  11. JavaScript中this的指向 详解
  12. Qt制作透明背景图片与裁剪图片
  13. Pvr_Controller
  14. PP报工确认bapi:BAPI_PRODORDCONF_CREATE_TT
  15. ASP.NET MVC5+EF6+EasyUI 后台管理系统(53)-工作流设计-我的批阅
  16. GRU和LSTM的单元结构
  17. EPICS modbus模块驱动程序示例2(模拟量)
  18. T---EXCEL表格换行
  19. 优雅编程之这样重构函数(续),你就“正常”了(二十)
  20. 博客园及相关学习地址收录

热门文章

  1. 美图公司去年净利润8510万,“炒币”浮盈近4亿元
  2. SAM简单介绍(百度翻译)
  3. 太阳能无线充电系统设计
  4. 子网掩码计算题与解析
  5. 前后分离必备神器,YApi小白部署攻略
  6. 【python】cannot import name ‘Imputer‘ from ‘sklearn.preprocessing‘ 解决办法
  7. http上传文件服务器限制大小,修改Nginx与Apache配置参数解决http状态码:413上传文件大小限制问题...
  8. 备份一下mysql笔记
  9. 个人微信公众号申请流程
  10. html5 canvas画彩虹,HTML5/Canvas连接的彩虹点平滑动画