AJAX请求能否同时返回PDF文件与JSON信息两种不同类型的响应?
AJAX请求能否同时返回PDF文件与JSON信息两种不同类型的响应?
当然可以在单次AJAX请求里同时搞定PDF文件下载和JSON消息返回,完全不用发起第二次请求!给你两个实用的实现思路,结合你现有的代码改改就行:
方案一:用HTTP响应头携带JSON信息(最简便)
这个方法的核心是把JSON格式的消息放在自定义HTTP响应头里,响应主体依然返回PDF的二进制数据——这样既不影响PDF的下载逻辑,又能顺带拿到你要的提示信息,处理起来特别简单。
调整你的PHP代码
原来的PHP是直接输出JSON,现在改成生成PDF的同时,把消息塞进响应头里:
// 先准备要返回的消息 $response['msg'] = 'PDF is created!'; // 把JSON消息编码后放在自定义响应头里,避免特殊字符解析问题 header('X-Response-Msg: ' . json_encode($response)); // 然后生成并输出PDF内容 $createPdf = new CreatePdf; // 假设你的CreatePdf类有个输出PDF的方法(比如generate()),这里替换成实际生成逻辑 header('Content-Type: application/pdf'); // 也可以设置Content-Disposition,不过前端已经处理下载了,这步可选 // header('Content-Disposition: inline; filename="' . $_POST['invoicenumber'] . '.pdf"'); echo $createPdf->generate(); // 输出PDF的二进制数据
调整你的JavaScript代码
在fetch的流程里,先从响应头里取出消息,再处理PDF的下载:
var form = event.target; var formData = new FormData(form); fetch(url,{ method: 'post', body: formData }).then(response => { // 第一步:先从响应头里拿JSON消息 const msgHeader = response.headers.get('X-Response-Msg'); if (msgHeader) { const msgData = JSON.parse(msgHeader); console.log(msgData.msg); // 这里就能打印出"PDF is created!"啦 // 你还可以把这个消息显示在页面上,比如用alert或者插入到DOM里 // alert(msgData.msg); } // 第二步:继续处理PDF的blob return response.blob(); }).then(blob => { const downloadUrl = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = downloadUrl; a.download = formData.getAll("invoicenumber")+".pdf"; document.body.appendChild(a); a.click(); // 记得做个清理,避免内存泄漏 URL.revokeObjectURL(downloadUrl); document.body.removeChild(a); });
方案二:打包混合类型响应(适合复杂场景)
如果你的JSON消息特别复杂,或者不想用响应头,也可以把JSON和PDF用一个自定义边界字符串打包成混合响应(类似表单提交的multipart格式)。PHP里先输出边界符、JSON内容,再输出PDF的二进制数据;前端拿到响应后,按边界分割内容,分别解析JSON和PDF的blob。
不过这个方法需要处理文本与二进制的混合解析,比方案一麻烦不少,所以如果不是必要,优先用方案一就够啦。
备注:内容来源于stack exchange,提问作者RickB
相关产品推荐
相关产品推荐

