You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确下载服务器返回的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 23:06:04