Laravel中POST请求调用Dompdf返回乱码而非PDF文件问题
解决Ajax请求dompdf返回PDF原始数据而非可下载文件的问题
我太懂你这种糟心的情况了——本来想通过Ajax触发PDF下载,结果返回一堆看起来像乱码的%PDF-1.3开头的内容,完全不是预期的下载弹窗。其实问题出在Ajax请求本身不会自动处理二进制文件的下载逻辑,浏览器默认把响应当成普通文本解析了,所以才显示了PDF的原始二进制代码。
下面给你一步步解决的办法:
第一步:修改前端fetch请求,处理二进制响应
你需要告诉fetch我们要接收的是二进制Blob数据,然后手动触发浏览器的下载行为:
fetch('/exportPDF',{ method: 'POST', cache: 'no-cache', credentials: 'same-origin', headers: { 'Content-type': 'application/json', "X-CSRF-TOKEN": token }, referrerPolicy: 'no-referrer', body: JSON.stringify({ record: appendTotalRecord }) }) .then(response => { // 先检查请求是否成功 if (!response.ok) { throw new Error('请求失败'); } // 将响应转换为Blob对象(二进制数据) return response.blob(); }) .then(blob => { // 创建临时URL指向Blob数据 const downloadUrl = window.URL.createObjectURL(blob); // 创建隐藏的a标签来触发下载 const link = document.createElement('a'); link.href = downloadUrl; // 设置下载的文件名,可根据需求修改 link.download = 'candidates_export.pdf'; // 把a标签加到页面上并触发点击 document.body.appendChild(link); link.click(); // 清理临时资源,避免内存泄漏 window.URL.revokeObjectURL(downloadUrl); document.body.removeChild(link); }) .catch(err => { console.error('PDF下载失败:', err); });
第二步:确保后端响应头正确(可选但推荐)
虽然dompdf的download()方法应该已经设置了正确的响应头,但如果还是有问题,可以手动在控制器里指定响应头,确保浏览器能正确识别这是一个可下载的PDF文件:
public function exportCandidates(Request $request){ // ... 你的数据查询和PDF生成逻辑保持不变 ... $html = \View::make("pdf")->with('response', $response_array); $pdf = PDF::LoadHTML($html); $pdfContent = $pdf->output(); // 手动设置响应头并返回 return response($pdfContent, 200) ->header('Content-Type', 'application/pdf') ->header('Content-Disposition', 'attachment; filename="candidates_export.pdf"'); }
为什么这样能解决问题?
- 前端通过
response.blob()把返回的二进制PDF数据转换成Blob对象,这是浏览器能识别的二进制文件类型。 - 通过创建临时URL和a标签,利用
download属性触发浏览器的下载机制,让浏览器把Blob数据当成文件来处理,而不是解析成文本显示。
内容的提问来源于stack exchange,提问作者Hassan Malik
相关产品推荐
相关产品推荐

