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

如何在Angular7中从Codeigniter+PHPExcel下载Excel文件且不存服务器?

问题原因与解决方法

你遇到的这个错误核心原因是:Angular的HttpClient默认会把服务器返回的响应当作JSON来解析,但你的PHP接口返回的是二进制的Excel文件流,这就导致JSON解析器遇到非JSON字符时抛出语法错误。下面分两部分一步步解决问题:


一、修改Angular代码,让请求接收Blob类型响应

1. 调整服务中的请求配置

把http.post的响应类型明确设置为blob,同时修正返回类型(不要用any[],因为返回的是Blob对象):

generateExcel(body){
  const url = `${baseurl.base_url}api/generate_excel/get_file`;
  const header = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded');
  // 关键:设置responseType为'blob',类型断言是为了绕过TypeScript类型检查
  return this.http.post<Blob>(url, body, {
    headers: header,
    responseType: 'blob' as 'json'
  });
}

2. 调整组件中的订阅逻辑

现在接口返回的就是Blob对象,不需要再手动包装,直接用saveAs保存即可:

this.generateExcelService.generateExcel(JSON.stringify(table)).subscribe((response: Blob) => {
  saveAs(response, 'file.xls');
}, error => {
  console.error('下载失败:', error);
});

二、确保PHP/CodeIgniter接口输出正确的二进制流

你的PHP代码已经设置了基础响应头,但还有几个细节要完善,避免破坏Excel文件完整性:

1. 清理输出缓冲并终止脚本

CodeIgniter默认开启输出缓冲,如果有多余的空格、换行或调试输出,会混入Excel流导致文件损坏。在输出Excel后要立即终止脚本:

$objWriter = PHPExcel_IOFactory::createWriter($this->objPHPExcel, 'Excel5');
header('Content-type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="file.xls"');
header('Cache-Control: max-age=0');
// 清理之前的输出缓冲,避免混入多余内容
ob_end_clean();
$objWriter->save('php://output');
// 终止脚本,防止CodeIgniter输出后续内容
exit;

2. 检查是否有多余输出

确保你的CodeIgniter控制器、模型或钩子中没有额外的echo、var_dump,也不要在PHP标签外留空白字符(比如<?php前的换行),这些都会破坏二进制流。


验证步骤

  1. 重启Angular开发服务器和CodeIgniter服务;
  2. 点击下载按钮,检查控制台是否还有JSON解析错误;
  3. 如果下载的文件无法打开,用Postman直接请求接口,确认返回的是合法的Excel文件。

内容的提问来源于stack exchange,提问作者Dierp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:26:10