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

如何在CodeIgniter中实现站点Zip文件上传及下载?空Zip问题排查

嘿,我来帮你搞定这个问题!先给你讲清楚怎么在CodeIgniter里实现Zip文件的添加和下载,再帮你排查你代码里导致Zip为空的问题。

在CodeIgniter中实现Zip文件添加与下载功能

CodeIgniter自带的Zip类已经帮我们封装好了大部分操作,步骤非常清晰:

  1. 加载必要的库和助手
    首先要加载Zip类和文件操作助手,这样才能使用压缩和文件读取的相关方法:

    $this->load->library('zip');
    $this->load->helper('file');
    
  2. 准备要压缩的文件/目录
    你可以根据需求选择不同的压缩方式:

    • 单个文件:用$this->zip->read_file('文件路径', true);,第二个参数true表示保留文件的相对路径(可选)
    • 多个文件:循环遍历文件列表,逐个添加到Zip中
    • 整个目录:直接用$this->zip->read_dir('目录路径', true);,一键添加目录下所有文件(包括子目录,可选保留结构)
  3. 触发下载
    最后调用download方法,传入要生成的Zip文件名即可:

    $this->zip->download('your_filename.zip');
    

解决你遇到的「Zip内容为空」问题

看了你的代码,核心问题出在路径拼接错误上!

你定义的$path = './View/items/reveal';没有末尾的斜杠,当你循环$files(get_filenames返回的是不带路径的纯文件名)时,直接$path.$f会把路径和文件名硬凑在一起——比如路径是./View/items/reveal,文件名是demo.html,拼接后就变成了./View/items/revealdemo.html,这个路径根本不存在,所以read_file找不到文件,Zip自然是空的。

另外,你的代码也缺少必要的存在性检查,比如目录是否存在、文件是否可读,这些都可能导致空Zip的情况。

修正后的代码

public function zip() {
    $this->load->library('zip');
    $this->load->helper('file');
    
    // 给路径加上末尾的斜杠,避免拼接错误
    $path = './View/items/reveal/';
    
    // 先检查目录是否存在
    if (!is_dir($path)) {
        show_error('指定的目录不存在,请检查路径!');
        return;
    }
    
    // 获取目录下的所有文件名
    $files = get_filenames($path);
    
    // 检查目录里有没有文件
    if (empty($files)) {
        show_error('目标目录中没有可压缩的文件!');
        return;
    }
    
    foreach($files as $f) {
        $full_file_path = $path . $f;
        // 确保文件存在且可读
        if (is_file($full_file_path) && is_readable($full_file_path)) {
            $this->zip->read_file($full_file_path, true);
        }
    }
    
    // 检查Zip是否有内容,避免下载空文件
    if (empty($this->zip->get_files())) {
        show_error('没有成功添加任何文件到Zip中!');
        return;
    }
    
    // 触发下载
    $this->zip->download('test.zip');
}

更简洁的写法(直接压缩整个目录)

其实CodeIgniter的Zip类支持直接读取整个目录,不用手动循环,这样更省心:

public function zip() {
    $this->load->library('zip');
    
    $path = './View/items/reveal/';
    
    if (!is_dir($path)) {
        show_error('指定的目录不存在!');
        return;
    }
    
    // 直接读取整个目录的文件,第二个参数true表示保留目录结构
    $this->zip->read_dir($path, true);
    
    if (empty($this->zip->get_files())) {
        show_error('没有可压缩的文件!');
        return;
    }
    
    $this->zip->download('test.zip');
}

内容的提问来源于stack exchange,提问作者Muhammad Usman Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:44:35