如何正确下载服务器返回的Buffer中存储的PDF文件
PDF下载后文件损坏的根因排查
- Blob构造的入参存在硬错误:
Blob构造函数的第一个参数要求传入由二进制类型、字符串组成的可迭代数组。原代码直接将接口返回的裸数字数组作为第一个参数传入,既没有按要求包裹数组结构,也没有做二进制类型转换,此时Blob会将每个数字按UTF-16字符串规则解析拼接,完全破坏原PDF的二进制文件结构,最终生成的文件自然会提示损坏无法打开。 - 遗漏了序列化数据的还原步骤:JSON格式本身无法直接承载原始二进制Buffer,后端返回的Buffer对象经过接口序列化后,会转换为由0-255整数组成的普通JS数组,必须在前端转换为浏览器可识别的Uint8Array二进制视图,才能生成有效的文件内容。
可直接复用的正确实现代码
// 将序列化后的数字数组还原为合法的Uint8Array二进制视图 const binaryContent = new Uint8Array(attach.content.data); // 生成对应MIME类型的Blob,注意必须将二进制内容包裹在数组中传入构造函数 const fileBlob = new Blob([binaryContent], { type: attach.contentType || 'application/pdf' }); // 创建临时下载触发元素 const downloadObjectUrl = window.URL.createObjectURL(fileBlob); const tempDownloadLink = document.createElement('a'); tempDownloadLink.style.display = 'none'; tempDownloadLink.href = downloadObjectUrl; tempDownloadLink.download = attach.filename; document.body.appendChild(tempDownloadLink); // 触发下载动作 tempDownloadLink.click(); // 延迟释放内存,避免ObjectURL常驻占用 setTimeout(() => { window.URL.revokeObjectURL(downloadObjectUrl); document.body.removeChild(tempDownloadLink); }, 0);
优化建议
- 如果可以调整接口请求配置,更稳定的方案是把对应附件接口的
responseType设置为'blob',从源头获取未被JSON序列化破坏的原始二进制流,省去前端手动转换的步骤,从根源上避免转换出错的问题。 - 排查全链路的编码逻辑:要确认网关、请求拦截器没有对二进制返回流做额外的文本转码、替换操作,哪怕前端转换步骤完全正确,只要二进制数据在传输过程中被按文本规则修改,生成的文件依然会损坏。
- 注意Blob构造的固定语法:无论传入的是字符串、二进制数组还是其他类型的内容,都必须将其放在数组结构中作为第一个参数传入,不做包裹直接传参的写法,大概率会生成无效文件。
内容的提问来源于stack exchange,提问作者Juliana Hill
相关产品推荐
相关产品推荐

