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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:24:03