前端大文件下载(带进度条)
前端大文件下载(带进度条)
- 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.可优化点
增加暂停/继续、取消按钮对进度条进行控制,实现断点续传;
前端大文件下载(带进度条)相关推荐
- python 全栈开发,Day36(作业讲解(大文件下载以及进度条展示),socket的更多方法介绍,验证客户端链接的合法性hmac,socketserver)...
先来回顾一下昨天的内容 黏包现象 粘包现象的成因 : tcp协议的特点 面向流的 为了保证可靠传输 所以有很多优化的机制 无边界 所有在连接建立的基础上传递的数据之间没有界限 收发消息很有可能不完全 ...
- 036_python的大文件下载以及进度条展示
复习 1.黏包现象 粘包现象的成因: tcp协议的特点,面向流的,为了保证可靠传输,所以有很多优化的机制. 无边界 所有在连接建立的基础上传递的数据之间没有界限. 收发消息很有可能不完全相等. 缓存机 ...
- php - 基于 webuploader 视频大文件分片分段上传,支持断点续传(刷新、关闭页面、重新上传、网络中断等情况)带进度条,前端后端都有示例源码详细教程
效果图 文件上传前先检测该文件是否已上传,如果已上传提示 "文件已存在",如果未上传则直接上传. 基于 php+webuploader的大文件分片上传,带进度条,支持断点续传(刷新 ...
- php带截切图片上传_PHP大文件切割上传并带进度条功能示例
本文实例讲述了PHP大文件切割上传并带进度条功能.分享给大家供大家参考,具体如下: 前面一篇介绍了PHP大文件切割上传功能,这里再来进一步讲解PHP大文件切割上传并带进度条功能. 项目结构图: 14- ...
- 带进度条的ASP无组件断点续传下载代码
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <%Option Explicit%> <% '= ...
- ASP无组件上传带进度条
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <%Option Explicit%> <% '= ...
- 【MFC】带进度条的状态栏
00. 目录 文章目录 00. 目录 01. 案例概述 02. 开发环境 03. 关键技术 04. 程序设计 05. 秘笈心法 06. 源码下载 07. 附录 01. 案例概述 状态栏多用于显示程序执 ...
- php 异步进度条,PHP学习:PHP+Ajax异步带进度条上传文件实例
<PHP学习:PHP+Ajax异步带进度条上传文件实例>要点: 本文介绍了PHP学习:PHP+Ajax异步带进度条上传文件实例,希望对您有用.如果有疑问,可以联系我们. PHP应用前端引入 ...
- 从FTP下载文件带进度条
1 #region 获取FTP服务器上指定文件的大小 2 /// <summary> 3 /// 获取FTP服务器上指定文件的大小 4 /// </summary> 5 /// ...
- java mvc上传文件进度_java相关:springMVC+ajax实现文件上传且带进度条实例
java相关:springMVC+ajax实现文件上传且带进度条实例 发布于 2020-7-5| 复制链接 本篇文章主要介绍了springMVC+ajax实现文件上传且带进度条实例,具有一定的参考价值 ...
最新文章
- docker容器运行mysql持久化_docker容器实现数据持久化的两种方式及其区别
- R语言ggplot2可视化绘制分组水平并行条形图(bar plot)并为条形图内添加标签
- gcc for Windows 开发环境介绍
- mysql自增变量插入行时需要赋值
- URL URI傻傻分不清楚,dart告诉你该怎么用
- 有关 !DOCTYPE HTML
- 【读书笔记《Android游戏编程之从零开始》】2.Hello,World!
- 计算机网络(北京理工大学出版社)课后习题答案
- SIP呼叫流程——现代交换原理实验四
- java ognl表达式_ognl 详解 Struts2中的OGNL表达式 | 学步园
- JavaScript中this的指向 详解
- Qt制作透明背景图片与裁剪图片
- Pvr_Controller
- PP报工确认bapi:BAPI_PRODORDCONF_CREATE_TT
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(53)-工作流设计-我的批阅
- GRU和LSTM的单元结构
- EPICS modbus模块驱动程序示例2(模拟量)
- T---EXCEL表格换行
- 优雅编程之这样重构函数(续),你就“正常”了(二十)
- 博客园及相关学习地址收录
热门文章
- 美图公司去年净利润8510万,“炒币”浮盈近4亿元
- SAM简单介绍(百度翻译)
- 太阳能无线充电系统设计
- 子网掩码计算题与解析
- 前后分离必备神器,YApi小白部署攻略
- 【python】cannot import name ‘Imputer‘ from ‘sklearn.preprocessing‘ 解决办法
- http上传文件服务器限制大小,修改Nginx与Apache配置参数解决http状态码:413上传文件大小限制问题...
- 备份一下mysql笔记
- 个人微信公众号申请流程
- html5 canvas画彩虹,HTML5/Canvas连接的彩虹点平滑动画