CodeIgniter实现PDF下载功能时文件变为.file格式报错如何解决
解决思路
- 补充MIME类型参数
CodeIgniter的force_download函数支持第三个参数传入文件MIME类型,未传参时系统自动识别MIME容易出现偏差,导致浏览器无法判断文件格式,默认保存为.file格式。可调用CI内置的get_mime_by_extension方法获取对应文件的正确MIME类型传入即可。 - 清理输出缓冲区
如果控制器执行过程中存在多余输出(包括PHP报错信息、代码前置的空格/echo内容),会篡改文件头信息导致浏览器无法识别PDF格式,调用ob_clean()可清空缓冲区多余内容,下载逻辑末尾加exit确保无后续输出污染文件内容。 - 处理文件名编码
如果存储的PDF文件名包含中文、空格或特殊字符,HTTP头传输时未编码会导致文件名解析异常,可对文件名做rawurlencode编码处理,确保浏览器正确识别文件后缀。 - 增加文件存在性校验
提前校验路径下的文件是否真实存在,避免下载空内容或错误内容导致格式识别失败。
修复后控制器参考代码
function get_file(){ $id = $this->uri->segment(3); $get_db = $this->m_dpks->get_file_byid($id); $q = $get_db->row_array(); $file = $q['file_data']; $path = './assets/dpks/'.$file; // 校验文件是否存在 if (!file_exists($path)) { show_error('文件不存在'); return; } $data = file_get_contents($path); $name = $file; // 获取正确的MIME类型 $mime = get_mime_by_extension($path); // 清空缓冲区多余内容 ob_clean(); // 传入MIME参数触发下载 force_download($name, $data, $mime); exit; }
备选方案(手动输出下载头)
如果修改force_download参数后问题仍然存在,可以直接手动输出HTTP下载头替换原有逻辑:
function get_file(){ $id = $this->uri->segment(3); $get_db = $this->m_dpks->get_file_byid($id); $q = $get_db->row_array(); $file = $q['file_data']; $path = './assets/dpks/'.$file; if (!file_exists($path)) { show_error('文件不存在'); return; } ob_clean(); header('Content-Type: application/pdf'); header('Content-Disposition: attachment; filename="'.rawurlencode($file).'"'); header('Content-Length: '.filesize($path)); readfile($path); exit; }
内容的提问来源于stack exchange,提问作者Pandu
相关产品推荐
相关产品推荐

