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

CodeIgniter中下载后删除文件失败问题求助

嘿,这个问题我之前也碰到过!核心原因其实是CodeIgniter的force_download()函数在执行完文件输出后会直接终止脚本(它内部调用了exit()),所以你写在它后面的删除代码根本没机会运行。

给你两个可行的解决方案,根据你的文件大小选就行:

方案一:先读文件内容,删文件再输出(适合小文件)

这种方式是把文件内容先读进内存,删除原文件后再用force_download()输出内容给用户,代码大概这样:

// 定义你的文件路径(这里用FCPATH确保路径正确)
$file_path = FCPATH . 'downloads/your-target-file.pdf';
$file_name = basename($file_path);

if (file_exists($file_path)) {
    // 读取文件内容
    $file_content = file_get_contents($file_path);
    
    if ($file_content !== false) {
        // 读取成功后立即删除原文件
        unlink($file_path);
        // 输出内容让用户下载
        force_download($file_name, $file_content);
    } else {
        // 处理读取失败的情况
        show_error('无法读取待下载文件');
    }
} else {
    show_error('目标文件不存在');
}

方案二:手动处理下载头,输出文件后删除(适合大文件)

如果文件很大,用file_get_contents会占用过多内存,这时候可以手动发送HTTP头,用readfile()边读边输出,之后再删除文件:

$file_path = FCPATH . 'downloads/large-data.zip';
$file_name = basename($file_path);

if (file_exists($file_path)) {
    // 发送下载相关的HTTP头
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="' . $file_name . '"');
    header('Content-Length: ' . filesize($file_path));
    header('Cache-Control: no-cache');
    header('Pragma: no-cache');
    
    // 边读边输出文件内容到浏览器
    readfile($file_path);
    
    // 现在执行删除操作
    if (!unlink($file_path)) {
        // 记录错误日志,方便后续排查
        log_message('error', '删除文件失败:' . $file_path);
    }
    
    // 手动终止脚本
    exit;
} else {
    show_error('目标文件不存在');
}

额外注意事项

  • 权限检查:确保运行PHP的服务器用户(比如www-data)对下载目录有写入/删除权限,否则unlink()会执行失败。可以用chmod调整目录权限,或者检查服务器的用户组设置。
  • 错误日志:建议在删除操作后加错误检查,把失败信息记录到CodeIgniter的日志里,方便后续排查问题。
  • 并发场景处理:如果有多个用户同时下载同一个文件,可能会出现一个用户删除后另一个用户下载失败的情况。这种场景下,你可以先复制文件到临时目录,让用户下载临时文件,之后再清理临时文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:13:42