关于CI框架批量导出至压缩文件

最近收到了一个需求,需要将很多文件导出为压缩文件,刚开始以为需要先一层一层将目录创建好,把对应文件放进去,然后利用压缩类对大文件夹整体压缩,后面发现没这么复杂,CI的read_file方法直接将文件读取进指定位置就可以了,然后download下载之后就是你想要的层级结构。

实践之后遇到了一个问题,阿里云oss的文件没法直接写入到压缩文件,可能是读取不到吧,因为本地文件是可以直接写入的。在网上没找到解决方法,想了一下,干脆将文件先写入本地,然后从本地写入压缩文件吧,问题又来了,常用的file_get_contents和file_put_contents没法将oss文件写入到本地,可能我技术不精,换个姿势使用curl读取,成功了,问题解决。下面是实现方式。。。没有去深究,如果有大神帮我解答原因,十分感激。

$cur_encoding = iconv_get_encoding();		//获取当前iconv的编码,方便后面转换
$this->load->library(zip);
foreach ($attach_file as $v){
    $extend2 = strtolower(strrchr($v[url], .));	//获取后缀
    //---------使用curl将文件写入本地
    $ch = curl_init($v[url]);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
    $rawdata = curl_exec ($ch);
    curl_close ($ch);
    $fp = fopen(APPPATH.cache/tmpdocx/a.$extend2,w);	//fopen的第一个参数,如果指定目录的话,目录如果不存在,将不会写入成功。也可以直接放在根目录下,反正这个文件只是一个临时文件,在写入压缩文件后还是会删除的。
    fwrite($fp, $rawdata);
    fclose($fp);
    //----------写入完毕。
    $dir_name = $dir_title./任务书/;
    $dir_name = iconv ( $cur_encoding[input_encoding], GBK, $dir_name);	//这里是确保文件名编码支持中文,用iconv转为GBK
    $file_name = iconv($cur_encoding[input_encoding],GBK,$v[name]);
    //用read_file写入压缩问价,第一个参数就是前面利用curl写入的本地文件,第二个参数是目标位置,支持层级,也就是压缩文件里面对应的目录层级。
    $this->zip->read_file(APPPATH.cache/tmpdocx/a.$extend2,$dir_name.$file_name);
    //删除curl生成的临时文件。
    unlink(APPPATH.cache/tmpdocx/a.$extend2);
}
//所有文件写入压缩文件之后,导出,浏览器会自动下载。
$this->zip->download(资料.zip);
经验分享 程序员 微信小程序 职场和发展