关于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');
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值