CodeIgniter框架导出CSV时浏览器下载文件打开为空问题求助
问题根因
你的代码仅将CSV内容写入了服务器本地磁盘的指定文件,没有将内容输出到HTTP响应流,浏览器仅接收到下载响应头,无实际文件内容,因此下载的文件为空,服务器本地存储的文件是完整的。
修复方案
在写完本地文件后新增内容输出逻辑即可,同时补充几个常见问题的兼容处理:
- 清空输出缓冲区,避免框架输出的调试信息、多余空格污染CSV内容
- 新增UTF-8 BOM头,解决Office打开CSV中文乱码问题
- 声明文件长度,提升下载稳定性
- 输出完成后终止程序,避免后续代码输出多余内容
修正后控制器代码
public function export_webdata($p_id,$inptid){ $project = $this->Lead_Model->get_project_single($p_id); $filename = $project[0]->p_name.'_WebsiteInfo_'.time().'.csv'; $path = getcwd().'/public/files/'.$project[0]->p_name.'/'; if (!file_exists($path)){ mkdir($path, 0777, true); } $full_file_path = $path . $filename; // 写入本地服务器文件 $output = fopen($full_file_path, 'w'); $header = array("Company","Country","Website"); fputcsv($output, $header); $extdata = $this->Lead_Model->webdata_export($inptid); foreach ($extdata as $key=>$line){ fputcsv($output,$line); } fclose($output); // 输出文件到浏览器 ob_clean(); header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename="'.$filename.'"'); header('Content-Length: ' . filesize($full_file_path)); // 输出UTF-8 BOM echo chr(0xEF) . chr(0xBB) . chr(0xBF); readfile($full_file_path); exit; }
可选优化
如果你不需要在服务器留存CSV文件,可以直接写入php://output流,无需写本地磁盘,节省服务器存储空间:
public function export_webdata($p_id,$inptid){ $project = $this->Lead_Model->get_project_single($p_id); $filename = $project[0]->p_name.'_WebsiteInfo_'.time().'.csv'; ob_clean(); header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename="'.$filename.'"'); echo chr(0xEF) . chr(0xBB) . chr(0xBF); $output = fopen('php://output', 'w'); $header = array("Company","Country","Website"); fputcsv($output, $header); $extdata = $this->Lead_Model->webdata_export($inptid); foreach ($extdata as $key=>$line){ fputcsv($output,$line); } fclose($output); exit; }
排查验证建议
如果修改后仍有问题,可按以下步骤排查:
- 临时打印
$extdata的内容,确认模型查询返回了有效数据,避免查询条件不匹配导致无数据 - 检查框架是否有自动输出的模板内容、调试日志,确保输出缓冲区被正确清空
内容的提问来源于stack exchange,提问作者Jackson
相关产品推荐
相关产品推荐

