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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 03:19:54