Ziparchive,实现打包并且下载目录

一、应用场景

在项目中,大家肯定都见过php导出功能,比如导出成csv格式、excel格式,这些是很常见的,而我前面也有记录过导出成csv的方式,php 生成csv文件, 但是想要下载指定的文件夹呐??
在这里插入图片描述
现在想下载这个wx_media目录下的三个目录,怎么处理呐???

二、解决之法

首先想到了快速的方法1:使用laravel扩展;
可是调研发现,先不说能否实现,关键是这个扩展要求laravel版本高于5,pass

为了一劳永逸,我干脆采用PHP的扩展得了,直接使用PHP5.2以来就具有的Ziparchive类。如果使用请确保php.ini开启了ext-zip扩展

三、实现
1.首先,你肯定要开启这个PHP扩展的呀,
2.

public function getZipper()
    {
        $zip = new \ZipArchive();
        // 图片路径
        $img_path = public_path('/upload/wx_media/image');
        // MP3路径
        $mp3_path = public_path('upload/wx_media/mp3');
        $img_files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($img_path));
        $mp3_files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($mp3_path));

        $zip_file = $this->zip_file;
        $zip->open($zip_file, \ZipArchive::CREATE | \ZipArchive::OVERWRITE);
        
        $this->forZip($zip, $img_files, $img_path, 'image/');
        $this->forZip($zip, $mp3_files, $mp3_path, 'mp3/');

        $zip->close();
        return Redirect::to($zip_file);
    }

下面是打包的过程

public function forZip($zip, $files, $file_path, $new_path)
    {
        foreach ($files as $name => $file) {
            // 我们要跳过所有子目录
            if ( ! $file->isDir()) {
                $filePath = $file->getRealPath();
                // 用 substr/strlen 获取文件扩展名
                $relativePath = $new_path . substr($filePath, strlen($file_path) + 1);
                $zip->addFile($filePath, $relativePath);
            }
        }
    }

这样就会下载一个压缩包,而压缩包的地址则是存放在你指定的$zip_file地址中,其实就是打包了你指定的目录下的目录然后放在了一个定好的zip文件里面,最后在访问下载这个zip文件路径就下载了

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值