使用WordPress的wp_remote_post从API下载PDF文件遇阻求助
解决WordPress中wp_remote_post获取PDF后无法触发下载的问题
你已经拿到了API返回的完整PDF数据和正确响应头,问题出在没给浏览器发送正确的下载指令——直接echo内容会被浏览器当成普通文本处理。下面是具体的解决步骤和代码:
核心思路
要触发浏览器下载PDF,得先输出标准的HTTP响应头,明确告诉浏览器“这是一个需要下载的PDF文件”,接着输出PDF原始内容,最后必须阻止WordPress输出其他额外内容(比如主题的页眉页脚),避免破坏PDF结构。
完整代码示例
// 发起API请求(替换成你的实际请求参数) $api_response = wp_remote_post('你的API端点地址', [ 'body' => [ // 填写你需要传给API的参数 'param1' => 'value1', 'param2' => 'value2' ], // 如果API需要认证或自定义请求头,在这里添加 'headers' => [ 'Authorization' => 'Bearer your_token' // 示例,根据实际情况调整 ] ]); // 先检查请求是否成功 if (is_wp_error($api_response)) { echo '请求API失败:' . $api_response->get_error_message(); return; } // 提取响应头和PDF原始内容 $response_headers = wp_remote_retrieve_headers($api_response); $pdf_raw_content = wp_remote_retrieve_body($api_response); // 从Content-Disposition头里提取文件名 $download_filename = 'report.pdf'; // 默认文件名 if (isset($response_headers['content-disposition'])) { // 用正则匹配出header里的文件名 preg_match('/filename="?([^"]+)"?/', $response_headers['content-disposition'], $filename_matches); if (!empty($filename_matches[1])) { $download_filename = $filename_matches[1]; } } // 关键:输出下载所需的HTTP头 header('Content-Type: application/pdf'); header('Content-Disposition: attachment; filename="' . $download_filename . '"'); header('Content-Length: ' . strlen($pdf_raw_content)); // 禁止缓存,避免旧文件干扰下载 header('Cache-Control: no-cache, no-store, must-revalidate'); header('Pragma: no-cache'); header('Expires: 0'); // 输出PDF原始内容 echo $pdf_raw_content; // 必须立即退出,防止WordPress输出主题其他内容破坏PDF exit;
注意事项
- 执行时机:这段代码必须在WordPress输出任何内容之前运行——比如放在自定义页面模板的最顶部,或者自定义的WP REST路由里。如果已经有输出(比如主题的header),会导致
header()函数报错。 - 不要用urldecode:API返回的body已经是PDF的原始二进制数据,var_dump显示的字符串形式只是PHP对二进制数据的可读表示,直接输出即可,不需要额外解码。
- 错误处理:记得处理API请求失败的情况,避免给用户输出混乱内容。
这样处理后,用户访问这个页面/端点时,浏览器就会自动触发PDF文件的下载,文件名就是API返回的xyz.pdf。
内容的提问来源于stack exchange,提问作者user7236046
相关产品推荐
相关产品推荐

