• 技术文章 >php教程 >php手册

    将文件夹压缩成zip文件的php代码

    2016-06-13 12:20:21原创890
    1.请先下载我准备好的zip.php工具类,下载后解压,将里面的文件放入对应的目录中,我是放在虚拟目录下的include文件夹中。
    2.在你的php文件中加入下面代码即可

    复制代码 代码如下:


    require_once "./include/zip.php";
    $zip = new PHPZip();
    //$zip -> createZip("要压缩的文件夹目录地址", "压缩后的文件名.zip");   //只生成不自动下载
    $zip -> downloadZip("要压缩的文件夹目录地址", "压缩后的文件名.zip");  //自动下载


    实例:可以参考下面的伪代码来看一个具体的使用场景:
    代码

    复制代码 代码如下:


    require_once "./include/zip.php";
    if (!$download) {
    exit();
    }
    set_time_limit(60);
    $tmpManager = new TmpManager(); //假设我们有一个类来完成后面的操作
    $tempfolder = array();
    $tempfile = array();
    //假设我们是通过在页面上选择checkbox来下载已选的文件夹或文件,并一同打包
    for($i = 0;$i < $checkboxnum;$i++) {
    $value = ${"select".$i};
    if ($value != '') {
    $this_type = substr($value, 0, 1);
    $this_id = substr($value, 1);
    //将文件夹和文件的情况分开处理
    if ($this_type == 'd') {
    $tempfolder[] = $this_id;
    }
    elseif ($this_type == 'f') {
    $tempfile[] = $this_id;
    }
    }
    }
    @mkdir($tempdir);
    $curtempdir = "$tempdir/".$userid; //不同用户在不同的临时文件夹下操作
    if (file_exists($curtempdir)) {
    $tmpManager->DeleteDir($curtempdir); //删除旧的文件夹
    }
    if (sizeof($tempfolder) > 0 || sizeof($tempfile) > 0) {
    mkdir($curtempdir, 0777); //如果有要打包的文件货文件夹,重新创建文件夹
    }
    if (sizeof($tempfile) > 0) {
    $tmpManager->CopyFile($tempfile,$curtempdir); //将要下载的文件copy到创建的文件夹
    }
    if (sizeof($tempfolder) > 0) {
    $tmpManager->CopyFolder($tempfolder,$curtempdir); //将要下载的文件夹copy到创建的文件夹
    }
    $zip = new PHPZip();
    $zip -> downloadZip($curtempdir, "file_".date('Ymd').".zip"); //打包并下载


    zip.php

    复制代码 代码如下:


    /*
    File name: /include/zip.php
    Author: Horace 2009/04/15
    */
    class PHPZip{
    var $dirInfo = array("0","0");
    var $rootDir = '';
    var $datasec = array();
    var $ctrl_dir = array();
    var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
    var $old_offset = 0;

    function downloadZip(){
    createZip($dir, $zipfilename, true);
    }
    function createZip($dir, $zipfilename, $autoDownload = false){
    if (@function_exists('gzcompress')){
    @set_time_limit("0");
    if (is_array($dir)){
    $fd = fopen ($dir, "r");
    $fileValue = fread ($fd, filesize ($filename));
    fclose ($fd);
    if (is_array($dir)) $filename = basename($dir);
    $this -> addFile($fileValue, "$filename");
    }else{
    $this->dirTree($dir,$dir);
    }

    $zipfilenametemp = time().$zipfilename;
    $out = $this -> filezip();
    $fp = fopen($zipfilenametemp, "w");
    fwrite($fp, $out, strlen($out));
    fclose($fp);
    $filesize = filesize($zipfilenametemp);

    if ($filesize < 104857600) {
    if($autoDownload){
    header("Content-type: application/octet-stream");
    header("Content-disposition: attachment; filename=".$zipfilename);
    }
    echo $this -> filezip();
    }else{
    echo "create zip error!";
    }
    unlink($zipfilenametemp);
    }
    }
    //get dir tree..
    function dirTree($directory,$rootDir){
    global $_SERVER,$dirInfo,$rootDir;

    $fileDir=$rootDir;
    $myDir=dir($directory);
    while($file=$myDir->read()){
    if(is_dir("$directory/$file") and $file!="." and $file!=".."){
    $dirInfo[0]++;
    $rootDir ="$fileDir$file/";

    $this -> addFile('', "$rootDir");

    //go on n's folders
    $this->dirTree("$directory/$file",$rootDir);
    }else{
    if($file!="." and $file!=".."){
    $dirInfo[1]++;
    //$fd = fopen ("$directory/$file", "r");
    $fileValue = file_get_contents("$directory/$file");
    //fclose ($fd);
    $this -> addFile($fileValue, "$fileDir$file");
    }
    }
    }
    $myDir->close();
    }
    function unix2DosTime($unixtime = 0) {
    $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);

    if ($timearray['year'] < 1980) {
    $timearray['year'] = 1980;
    $timearray['mon'] = 1;
    $timearray['mday'] = 1;
    $timearray['hours'] = 0;
    $timearray['minutes'] = 0;
    $timearray['seconds'] = 0;
    } // end if

    return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
    ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
    }
    function addFile($data, $name, $time = 0){
    $name = str_replace('\\', '//m.sbmmt.com/m/', $name);

    $dtime = dechex($this->unix2DosTime($time));
    $hexdtime = '\x' . $dtime[6] . $dtime[7]
    . '\x' . $dtime[4] . $dtime[5]
    . '\x' . $dtime[2] . $dtime[3]
    . '\x' . $dtime[0] . $dtime[1];
    eval('$hexdtime = "' . $hexdtime . '";');

    $fr = "\x50\x4b\x03\x04";
    $fr .= "\x14\x00"; // ver needed to extract
    $fr .= "\x00\x00"; // gen purpose bit flag
    $fr .= "\x08\x00"; // compression method
    $fr .= $hexdtime; // last mod time and date

    // "local file header" segment
    $unc_len = strlen($data);
    $crc = crc32($data);
    $zdata = gzcompress($data);
    $c_len = strlen($zdata);
    $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
    $fr .= pack('V', $crc); // crc32
    $fr .= pack('V', $c_len); // compressed filesize
    $fr .= pack('V', $unc_len); // uncompressed filesize
    $fr .= pack('v', strlen($name)); // length of filename
    $fr .= pack('v', 0); // extra field length
    $fr .= $name;

    // "file data" segment
    $fr .= $zdata;

    // "data descriptor" segment (optional but necessary if archive is not
    // served as file)
    $fr .= pack('V', $crc); // crc32
    $fr .= pack('V', $c_len); // compressed filesize
    $fr .= pack('V', $unc_len); // uncompressed filesize

    // add this entry to array
    $this -> datasec[] = $fr;
    $new_offset = strlen(implode('', $this->datasec));

    // now add to central directory record
    $cdrec = "\x50\x4b\x01\x02";
    $cdrec .= "\x00\x00"; // version made by
    $cdrec .= "\x14\x00"; // version needed to extract
    $cdrec .= "\x00\x00"; // gen purpose bit flag
    $cdrec .= "\x08\x00"; // compression method
    $cdrec .= $hexdtime; // last mod time & date
    $cdrec .= pack('V', $crc); // crc32
    $cdrec .= pack('V', $c_len); // compressed filesize
    $cdrec .= pack('V', $unc_len); // uncompressed filesize
    $cdrec .= pack('v', strlen($name) ); // length of filename
    $cdrec .= pack('v', 0 ); // extra field length
    $cdrec .= pack('v', 0 ); // file comment length
    $cdrec .= pack('v', 0 ); // disk number start
    $cdrec .= pack('v', 0 ); // internal file attributes
    $cdrec .= pack('V', 32 ); // external file attributes - 'archive' bit set

    $cdrec .= pack('V', $this -> old_offset ); // relative offset of local header
    $this -> old_offset = $new_offset;

    $cdrec .= $name;

    // optional extra field, file comment goes here
    // save to central directory
    $this -> ctrl_dir[] = $cdrec;
    }
    function filezip(){
    $data = implode('', $this -> datasec);
    $ctrldir = implode('', $this -> ctrl_dir);

    return
    $data .
    $ctrldir .
    $this -> eof_ctrl_dir .
    pack('v', sizeof($this -> ctrl_dir)) . // total # of entries "on this disk"
    pack('v', sizeof($this -> ctrl_dir)) . // total # of entries overall
    pack('V', strlen($ctrldir)) . // size of central dir
    pack('V', strlen($data)) . // offset to start of central dir
    "\x00\x00"; // .zip file comment length
    }
    }
    ?>


    zip.php文件打包
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:Php 构造函数construct的前下划线是双的_ 下一篇:PHP+XML 制作简单的留言本 图文教程
    Web大前端开发直播班

    相关文章推荐

    • 在WAS CE上运行PHP• 基于php-fpm 参数的深入理解• php 深入理解strtotime函数的使用详解• PHP源码之explode使用说明• 收藏的PHP常用函数 推荐收藏保存

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网