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
相关产品推荐
相关产品推荐

