PHP使用curl下载PDF文件损坏无法打开问题排查求助
问题根本原因
你当前脚本的执行顺序是先require 'header.php',该文件会直接输出<doctype html>等HTML内容,这些内容会和后续输出的PDF二进制内容拼接,直接破坏了PDF的文件结构,同时你设置的Content-Length仅统计了PDF本身的长度,和实际输出的「HTML+PDF」总长度不匹配,最终导致PDF被识别为损坏。
可行解决方案
方案1:逻辑前置+提前终止(推荐)
将PDF下载的处理逻辑放在页面最顶部,在引入header.php之前执行,输出PDF后直接调用exit终止脚本,避免后续HTML内容输出:
// 页面最顶部优先处理PDF下载请求,替换成你自己的触发条件,比如参数判断 if (/* 判断当前请求是下载PDF */) { $ch = curl_init($remote_url); curl_setopt($ch, CURLOPT_URL, $remote_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Bearer '.$token)); $result = curl_exec($ch); curl_close($ch); header('Cache-Control: public'); header('Content-type: application/pdf'); header('Content-Disposition: attachment; filename="response.pdf"'); header('Content-Length: '.strlen($result)); echo $result; // 输出完成直接退出,不会执行后续引入header.php的逻辑 exit; } // 后续才是正常页面的逻辑 require 'header.php'; // 其他页面代码...
方案2:拆分独立下载接口
把PDF下载的逻辑单独封装到一个独立的PHP文件中,该文件不引入任何会输出HTML内容的公共头文件,从根源避免额外内容混入PDF。
方案3:输出前清空缓冲区(兜底方案)
如果不方便调整脚本执行顺序,可以在输出PDF头之前清空已经输出的内容,再终止后续输出:
// 清空之前输出的所有HTML内容 ob_end_clean(); header('Cache-Control: public'); header('Content-type: application/pdf'); header('Content-Disposition: attachment; filename="response.pdf"'); header('Content-Length: '.strlen($result)); echo $result; exit;
内容的提问来源于stack exchange,提问作者Charlie
相关产品推荐
相关产品推荐

