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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:36:02