一、问题:
开发中遇到下载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中无法触发click a.click(); $(a).remove();把base64位文件转化成exel文件后下载就缩短了href的URL长度完美解决问题