PHP使用自带的ZipArchive类,实现压缩文件目录

文章共分为两部分

1.第一部分使用PHP ZipArchive类压缩目录
2.第二部分开启php_zip.dll配置

第一部分使用PHP ZipArchive类压缩目录
调用zip()方法文件会生成zip包自动下载 根据需要将文件路径替换即可
	function zip(){
        $files = array(ROOT_PATH.'/public/Uploads/');
        //$files = array('upload/qrcode/1/1.jpg');
        $zipFile = ROOT_PATH.'/public/upload/download/'.date("Ymd").'/';
        $zipName = $zipFile.uniqid().'.zip';
        
        $zip = new \ZipArchive();
        if( !file_exists($zipFile) ) mkdir($zipFile, 0777, true); 
        $res = $zip->open($zipName, \ZipArchive::OVERWRITE | \ZipArchive::CREATE);
        if($res)
        {
            $this->compressDir($files[0],$zip);
            $zip->close();
        }


        if(!file_exists($zipName)){
            exit("无法找到文件"); //即使创建,仍有可能失败
        }
 
        //如果不要下载,下面这段删掉即可,如需返回压缩包下载链接,只需 return $zipName;
        header("Cache-Control: public");
        header("Content-Description: File Transfer");
        header('Content-disposition: attachment; filename='.basename($zipName)); //文件名
        header("Content-Type: application/zip"); //zip格式的
        header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件
        header('Content-Length: '. filesize($zipName)); //告诉浏览器,文件大小
        @readfile($zipName);
        exit();
    }


	function compressDir($files, $zip, $prev='')
    {
        $handler = opendir($files);
        $basename = basename($files);
        $zip->addEmptyDir($prev . '/' . $basename);
        while($file = readdir($handler))
        {
            $realpath = $files . '/' . $file;
            if(is_dir($realpath))
            {
                if($file !== '.' && $file !== '..')
                {
                    $zip->addEmptyDir($prev . '/' . $basename . '/' . $file);
                    $this->compressDir($realpath, $zip, $prev . '/' . $basename);
                }
            }else
            {
                $zip->addFile($realpath, $prev. '/' . $basename . '/' . $file);
            }
        }
        
        closedir($handler);
        return null;
    }

第二部分开启php_zip.dll配置

Windows环境:

1.首先需要从官网上下载,下载地址 https://windows.php.net/downloads/pecl/releases/zip/

2.打开官网列表后需要查找适合自己的PHP版本和系统的zip,我的PHP版本是5.5的,这里我选择的版本号是1.13.5
PHP使用自带的ZipArchive类,实现压缩文件目录_第1张图片

3.下载完后解压,把里面的php_zip.dll文件放到PHP的扩展文件夹里
PHP使用自带的ZipArchive类,实现压缩文件目录_第2张图片

扩展文件夹路径一般都是在PHP版本文件夹里的ext文件夹,譬如我的就是D:\phpStudy\PHPTutorial\php\php-7.1.13-nts\ext

4.把php_zip.dll文件放进去后,打开PHP的配置文件php.ini,添加extension=php_zip.dll,保存后,重启apache服务器

Linux环境:
1、在Linux下没有php_zip.dll这个文件(有也不会起作用的),所以需要重新编译一下php的zip模块。具体安装方法如下:

cd /usr/src

wget http://pecl.php.net/get/zip

tar -zxvf zip

cd zip-1.x.x

phpize

./configure

make

sudo make instal

其中, 在最后使用make install命令的时候,可能需要用到root的权限,所以建议使用sudo来运行。安装完之后,屏幕上会提示zip.so的位置。然后将其记录下来,如:/usr/local/lib/php/extensions/zip.so。

2、使用root权限修改php.ini(通常可能会在/usr/local/lib/文件夹下,不过视当初安装php而定,可以通过phpinfo()来查看):

增加extension = /usr/local/lib/php/extensions/zip.so,然后同样在php.ini文件中,将 zlib.output_compression = Off 改为 zlib.output_compression = On ;

3、最后别忘了重启一下Apache:apachectl restart;

这个针对php的zip模块就安装完成了,能够在php中使用ZipArchive类了。

ps:查看php.ini文件位置的方法是:


你可能感兴趣的:(php,zip)