如何用JavaScript下载PHP返回的Base64文件?下载后文件为空
解决Base64转本地文件下载空白问题
问题出在你处理Base64解码的方式上:用atob得到的是字符串,直接丢进Blob会被JS按UTF-8重新编码,破坏了原文件的二进制结构,导致PDF这类依赖精准二进制数据的文件打开空白。
正确的做法是把解码后的字符串转成Uint8Array二进制数组,再生成Blob。修改后的代码如下:
var name = json_obj['data']['nombre']; var base64Str = json_obj['data']['archivo']; // 如果Base64字符串带"data:application/pdf;base64,"前缀,先截取有效部分 if (base64Str.includes(',')) { base64Str = base64Str.split(',')[1]; } // 解码Base64并转换为Uint8Array二进制数组 var binaryStr = atob(base64Str); var uint8Array = new Uint8Array(binaryStr.length); for (var i = 0; i < binaryStr.length; i++) { uint8Array[i] = binaryStr.charCodeAt(i); } var file = new Blob([uint8Array], {type: 'application/pdf'}); link = URL.createObjectURL(file); var a = $("<a />"); a.attr("download", name); a.attr("href", link); $("body").append(a); a[0].click(); $("body").remove(a); // 释放URL对象,避免浏览器内存泄漏 URL.revokeObjectURL(link);
额外补充:最后加上URL.revokeObjectURL(link)可以及时释放创建的临时URL,避免长期占用浏览器内存。
内容的提问来源于stack exchange,提问作者Francisco
相关产品推荐
相关产品推荐

