使用CodeIgniter Zip类下载文件时出现0KB问题求助
排查CodeIgniter Zip类生成0KB压缩包的问题
遇到压缩包下载后大小为0KB的问题,大概率是没有成功向压缩包中添加任何有效文件,结合你的代码,我整理了几个核心排查点和修复方案:
1. 相对路径导致文件存在判断失效
你当前用file_exists("uploads/files/".$filedata)做存在性检查,但这个相对路径是相对于CodeIgniter的入口文件(index.php)所在目录吗?如果你的控制器不在根目录,或者请求的路由层级不同,相对路径会出错,导致file_exists返回false,循环里没有添加任何文件。
修复方案:用CodeIgniter内置的常量FCPATH(指向index.php所在的根目录)拼接绝对路径:
$local_file_path = FCPATH . "uploads/files/" . $filedata; if(file_exists($local_file_path)) { // 后续操作 }
2. 使用URL读取文件内容的风险
你用base_url()拼接出URL,再通过file_get_contents($filename)读取文件,这会发起HTTP请求来获取文件内容,可能遇到两个问题:
- 服务器的
allow_url_fopen配置为Off,导致无法通过URL读取文件; - 即使能读取,也可能因为网络或权限问题返回空内容,最终添加到压缩包的是空白文件。
修复方案:直接使用服务器本地的绝对路径读取文件内容:
$this->zip->add_data($filedata, file_get_contents($local_file_path));
3. 确认Zip库已正确加载
虽然你能调用$this->zip,但还是要确认Zip库已经被加载:
- 可以在控制器方法开头手动加载:
$this->load->library('zip'); - 或者在
application/config/autoload.php中添加'zip'到$autoload['libraries']数组,实现全局自动加载。
修复后的完整代码示例
public function downloadzip($argID){ $this->load->library('zip'); // 确保加载Zip库 $data = $this->Audit_started_model->getZipImagesOfSchool($argID); foreach($data as $r): $filedata = $r->file_name; $local_file_path = FCPATH . "uploads/files/" . $filedata; if(file_exists($local_file_path)) { // 用本地路径读取文件内容,添加到压缩包 $this->zip->add_data($filedata, file_get_contents($local_file_path)); } endforeach; // 检查压缩包是否有内容,避免下载空文件 if ($this->zip->get_files() !== []) { $this->zip->download(date('d-M-Y')); } else { // 可以给用户提示没有可下载的文件 echo "没有可用的文件可打包下载"; } }
额外验证步骤
- 手动检查服务器上
FCPATH/uploads/files/目录下是否存在你要打包的文件; - 在循环中添加
var_dump(file_exists($local_file_path)),确认哪些文件能被正确检测到; - 检查服务器的PHP错误日志,看是否有
file_get_contents相关的错误信息。
内容的提问来源于stack exchange,提问作者Jitendra Kumar
相关产品推荐
相关产品推荐

