一、问题:

开发中遇到下载exel文档;后端小哥返回来base64位的exel文件;刚开始文件比较小;本人使用创建a标签给href纸箱base64位文件

var a = document.createElement('a');a.download = fileName;var blobExel = e.target.result;//base64位文件
a.setAttribute('href',URL.createObjectURL(blobExel));

该方法在遇到下载文件超过2M左右文件的时候会在(IE、chrome等)很多浏览器下载失败

二、下载失败原因

经过认真对比,发现这个是各个浏览器对URL长度限制不同导致的;于是收集了各个浏览器的限制标准
IE 最大长度限制为2048字节
Chrome 最大长度限制为8182字节
Firefox 最大长度限制为65536字节
Safari 最大长度限制为80000字节
Opera 最大长度限制为190000字节

三、解决方案

后端返回的文件过大,长度过长导致了下载失败的问题;那就把href的长度变短点;把base64位文件转换成exel文件之后再把href只想该文件;废话不多说上代码

 baseExel:function (base64) {/*处理后端返回的base64位文件变成exel文件进行下载* 不要直接把base64位的exel文件直接给a标签的href,* 文件过大时base64位长度过长;chrome浏览器对a标签的href长度有限制;导致下载失败;* 建议用以下方法处理成本地文件再下载* */function getContentType(base64) {return /data:([^;]*);/i.exec(base64)[1];};function getData(base64) {return base64.substr(base64.indexOf("base64,") + 7, base64.length);};function b64toBlob(b64Data, contentType, sliceSize) {contentType = contentType || '';sliceSize = sliceSize || 512;var byteCharacters = atob(b64Data);var byteArrays = [];for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {var slice = byteCharacters.slice(offset, offset + sliceSize);var byteNumbers = new Array(slice.length);for (var i = 0; i < slice.length; i++) {byteNumbers[i] = slice.charCodeAt(i);}var byteArray = new Uint8Array(byteNumbers);byteArrays.push(byteArray);}var blob = new Blob(byteArrays, { type: contentType });return blob;};return b64toBlob(getData(base64), getContentType(base64));},
  var a = document.createElement('a');var file=e.target.result;               a.download = fileName;var blobExel = self.baseExel(e.target.result); //把base64位文件转化为exel文件a.setAttribute('href',URL.createObjectURL(blobExel));$("body").append(a);    // 修复firefox中无法触发clicka.click();$(a).remove();

把base64位文件转化成exel文件后下载就缩短了href的URL长度完美解决问题

各个浏览器a标签href下载文件链接长度过长,导致下载失败解决方案相关推荐

  1. 浏览器兼容性--IE11以及Edge等下载文件的中文名出现乱码,前后端解决方案

    浏览器兼容性--IE11以及Edge等下载文件的中文名出现乱码,前后端解决方案 参考文章: (1)浏览器兼容性--IE11以及Edge等下载文件的中文名出现乱码,前后端解决方案 (2)https:// ...

  2. 使用火狐浏览器下载文件需要等很长时间的解决办法

    前言:大伙日常在使用火狐浏览器的时候,经常遇到下载文件需要等很长的时间,今天给大家安利一个小技巧,让你的火狐下载文件的时候飞速提升. 1.打开火狐浏览器搜索 about:config ,接受风险并继续 ...

  3. 下载文件、(Blob数据流)下载PDF

    下载文件.(Blob数据流)下载PDF 方法一 (a标签) downloadFile(file) {let url= '你的文件地址'const elink = document.createElem ...

  4. python下载文件的11种方式_Python下载文件的11种方式

    在本教程中,你将学习如何使用不同的Python模块从web下载文件.此外,你将下载常规文件.web页面.Amazon S3和其他资源. 最后,你将学习如何克服可能遇到的各种挑战,例如下载重定向的文件. ...

  5. springboot上传下载文件(4)--上传下载工具类(已封装)

    因为在做毕设,发现之前的搭建ftp文件服务器,通过ftp协议无法操作虚拟机临时文件,又因为ftp文件服务器搭建的比较麻烦:而 hadoop的HDFS虽然可以实现,但我这里用不到那么复杂的:所以我封装了 ...

  6. linux下载文件夹到本地命令行,linux下载文件到本地命令,linux下载文件到本地命令 下载工具...

    linux下载文件到本地命令,linux下载文件到本地命令 下载工具 来源:互联网/编辑:佚名/时间:2020-09-08 在手机上看 扫一扫进入手机端 linux用户命令在哪个文件夹下 用 whic ...

  7. 视频下载网站链接:B站视频下载链接

    视频下载网站链接:B站视频下载链接 链接: 视频下载网站链接:B站视频下载链接

  8. ug提示找不到html文件,[图文教程] 以下文件无法加载,导致打开操作失败: 使用当前搜索选项找不到文件,部件已卸载...

    UG打开装配文件时提示:以下文件无法加载,导致打开操作失败: 使用当前搜索选项找不到文件,部件已卸载. 如下图所示: 这个问题,看到很多UG初学者有时就会问到这个问题,很简单的一个问题,但是有时有必要 ...

  9. a链接下载文件或者点击按钮自动下载

    文件下载方法 downloadFile(fileName:string,filePath:string){this.service.downloadFile(filePath).subscribe(f ...

最新文章

  1. 第一篇:BPE算法(附加)
  2. halcon python_使用pythonnet调用halcon脚本
  3. ubuntu9.04换源
  4. 聊聊高并发(二十九)解析java.util.concurrent各个组件(十一) 再看看ReentrantReadWriteLock可重入读-写锁
  5. 简单的Excel导出(两种方式)
  6. 对java的final,finally,finalize应用场景,你用对了吗
  7. 设计模式——装饰模式和代理模式
  8. eclipse-memory-analyzer使用说明
  9. C语言游戏编程之反弹小球
  10. 斐讯K2刷华硕固件教程(最新)
  11. 加拿大大学商用计算机专业,加拿大大学计算机专业排名一览
  12. python docx 字体设置_python docx 中文字体设置
  13. 支付宝扫码支付-PC版(沙箱环境)
  14. EFM32 LEUART波特率计算
  15. JavaScript反调试技巧
  16. 未来教师会被计算机代替,未来老师会被计算机所取代吗?Will The Teacher be Replaced by Computers in the Future-...
  17. 微信8.0或将开启新时代
  18. bt30与bt40哪个好_BT50刀柄柜_BT40刀头架_BT30刀具存放架
  19. matplotlib 合理设置colorbar和子图的对应关系
  20. Please reinstall the libzip distribution

热门文章

  1. SIM USIM ESIM UICC科普
  2. 打印菱形(Print Diamond/Lozenge)
  3. 把模块有关联的放在一个文件夹中 在python2中调用文件夹名会直接失败 在python3中调用会成功,但是调用不能成功的解决方案...
  4. mac查询端口号和关闭端口号
  5. netstat -anp 显示系统端口使用情况
  6. UVA 361 Cops and Robbers(凸包应用)
  7. 移动安全Android逆向系列:Dalvik概念破解实例
  8. Linux环境进程间通信系列(五):共享内存
  9. 后端开发-MySQL数据库相关流程图原理图
  10. 转黄金的沉默与辉煌[时寒冰]2013-04-13