JSZip在Internet Explorer中失效,求兼容三大浏览器的压缩下载代码
解决JSZip在IE浏览器中无法压缩下载文件的问题
嗨,我知道你现在被IE的兼容性问题搞头大了,咱们先来捋捋为啥原来的代码在IE里跑不起来:
- IE压根不支持通过
location.href跳转到base64格式的data URI来下载文件,尤其是文件稍微大一点直接就失效了; - 你用的同步
generate()方法,在IE里处理文件时不仅容易卡线程,返回的base64格式也不贴合IE的下载机制。
别担心,给你整理了一段能在Chrome、Firefox和IE(IE11及以上)都正常跑的代码,你直接替换原来的函数就行:
function downloadZip() { var zip = new JSZip(); zip.file("Hello.txt", "Hello World\n"); // 异步生成Blob格式的压缩包,避免卡线程,也更兼容IE zip.generateAsync({ type: "blob" }) .then(function(content) { // 先判断是不是IE浏览器 if (window.navigator && window.navigator.msSaveOrOpenBlob) { // IE专属的保存/打开文件方法,直接传Blob和文件名就行 window.navigator.msSaveOrOpenBlob(content, "example.zip"); } else { // 给Chrome、Firefox这些现代浏览器用的下载逻辑 var url = URL.createObjectURL(content); var downloadLink = document.createElement("a"); document.body.appendChild(downloadLink); downloadLink.href = url; downloadLink.download = "example.zip"; downloadLink.click(); // 用完记得释放临时URL,避免内存浪费 URL.revokeObjectURL(url); document.body.removeChild(downloadLink); } }) .catch(function(error) { console.error("压缩文件出错啦:", error); alert("压缩文件失败,请重试哦"); }); }
给你说说这段代码里的关键细节:
- 换成了
generateAsync({ type: "blob" }):异步生成Blob格式的压缩包,既不会卡页面,也完美适配IE的下载API; - 做了浏览器特性检测:通过
msSaveOrOpenBlob这个IE专属API来判断,精准处理IE的下载逻辑; - 现代浏览器用动态创建a标签的方式下载,还加了URL释放的步骤,避免内存泄漏;
- 加了错误捕获,万一压缩出问题能及时提示用户,也方便你排查bug。
最后再提几个小注意点:
- 确保你用的JSZip是3.x版本哦,这个版本才兼容IE11;
- 如果要压缩多个文件,直接继续用
zip.file()添加,或者用zip.folder()创建文件夹,逻辑和你原来的一样; - IE11对Blob的大小有上限,如果要压缩特别大的文件,可能得考虑分块处理或者给用户提个醒。
内容的提问来源于stack exchange,提问作者Rakshith L
相关产品推荐
相关产品推荐

