
本文详解 ajax 请求中 responsetype 设置为 arraybuffer 的必要性,解决因响应类型错误导致 blob 生成空 pdf 文件的常见问题,并提供完整可运行的前后端代码示例。
本文详解 ajax 请求中 responsetype 设置为 arraybuffer 的必要性,解决因响应类型错误导致 blob 生成空 pdf 文件的常见问题,并提供完整可运行的前后端代码示例。
在 Web 应用中通过 JavaScript 下载后端生成的 PDF 文件时,一个高频却隐蔽的 Bug 是:前端成功收到响应,但最终下载的 PDF 文件体积非零却无法打开(显示为空白或损坏)。根本原因往往并非后端逻辑错误,而是前端对二进制响应数据的处理方式不匹配——尤其当使用 $.ajax 时,若未显式指定 xhrFields.responseType = 'arraybuffer',jQuery 默认会将二进制响应按文本(如 UTF-8)解析,导致 PDF 的原始字节流被错误解码,进而使 Blob([data]) 构造出无效内容。
✅ 正确做法:强制指定 responseType 为 arraybuffer
PDF 是典型的二进制文件,必须以原始字节形式传递和构造 Blob。关键修改仅一行:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
$.ajax({
url: "myurl.pdf",
type: "GET",
data: { path: "/content/dam/example.pdf" },
xhrFields: {
responseType: "arraybuffer" // ← 必须!确保接收原始二进制数据
},
success: function (data) {
// data 现在是 ArrayBuffer,可直接用于 Blob 构造
const blob = new Blob([data], { type: "application/pdf" });
const url = window.URL.createObjectURL(blob);
const link = document.createElement("a");
link.href = url;
link.download = "document.pdf";
document.body.appendChild(link);
link.click();
// 清理内存引用
window.URL.revokeObjectURL(url);
document.body.removeChild(link);
},
error: function (xhr, status, err) {
console.error("PDF 下载失败:", err);
}
});
⚠️ 常见误区与注意事项
- 不要省略 responseType: 'arraybuffer':即使后端已正确设置 Content-Type: application/pdf 和 Content-Disposition,前端仍需显式声明响应类型,否则 jQuery 可能将其转为字符串(造成字节损坏)。
- 避免对 arraybuffer 数据进行额外编码/解码:如问题中尝试的 atob() 或 base64ToArrayBuffer(),仅适用于 Base64 编码的字符串场景;而本例中后端直传原始二进制流,data 已是 ArrayBuffer,直接传入 Blob 即可。
- 服务端无需改动:您提供的 AEM Servlet 代码完全正确——它通过 IOUtils.copy() 直接输出 InputStream 到 OutputStream,且设置了标准 PDF 头部,无需任何调整。
- 现代替代方案建议:若项目支持较新浏览器,推荐使用 fetch() 替代 $.ajax,语义更清晰且原生支持 response.arrayBuffer():
fetch("myurl.pdf", {
method: "GET",
headers: { "Accept": "application/pdf" }
})
.then(res => {
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.arrayBuffer(); // ← 显式获取 ArrayBuffer
})
.then(buffer => {
const blob = new Blob([buffer], { type: "application/pdf" });
const url = URL.createObjectURL(blob);
// ... 后续下载逻辑同上
});
✅ 总结
生成空白 PDF 的本质是二进制数据在传输链路中被意外文本化。解决方案极简却关键:在发起请求时,通过 xhrFields.responseType = 'arraybuffer'(jQuery)或 response.arrayBuffer()(Fetch)确保前端以原始字节接收响应,再交由 Blob 构造器封装。这一原则适用于所有二进制文件(如 Excel、图片、ZIP),是前后端协作中不可忽视的基础规范。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










