ziplib.php 파일은 google 검색을 통해 찾은 것입니다.

creator가 누군지는 아래에 나와 있네요.

사용법은 ziptest.php를 보시면 간단합니다.

인스턴스 먼저 생성하고 add_dir, add_file을 통해 압축하고자하는 폴더나 파일을 추가하시면 됩니다.

특정 폴더의 하위에 파일을 넣고자 하는 경우 add_dir을 통해 먼저 폴더를 추가한 후에

add_file시 파일 이름 앞에 폴더명을 추가해주면 됩니다.

MS Internet explorer 같은 경우 header 사용이 다른 점에 주의 하시기 바랍니다.

#########################################################################

ziplib.php

<?php  

/* 

Zip file creation class 

makes zip files on the fly...

use the functions add_dir() and add_file() to build the zip file; 

see example code below

by Eric Mueller 

http://www.themepark.com

v1.1 9-20-01 

  - added comments to example

v1.0 2-5-01

initial version with: 

  - class appearance 

  - add_file() and file() methods 

  - gzcompress() output hacking 

by Denis O.Philippov, webmaster@atlant.ru, http://www.atlant.ru

*/ 

// official ZIP file format: http://www.pkware.com/appnote.txt

class zipfile   

{  

    var $datasec = array(); // array to store compressed data 

    var $ctrl_dir = array(); // central directory    

    var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00"; //end of Central directory record 

    var $old_offset = 0; 

    function add_dir($name)   

    // adds "directory" to archive - do this before putting any files in directory! 

    // $name - name of directory... like this: "path/" 

    // ...then you can add files using add_file with names like "path/file.txt" 

    {   

        $name = str_replace("\\", "/", $name);  

        $fr = "\x50\x4b\x03\x04";  

        $fr .= "\x0a\x00";    // ver needed to extract 

        $fr .= "\x00\x00";    // gen purpose bit flag 

        $fr .= "\x00\x00";    // compression method 

        $fr .= "\x00\x00\x00\x00"; // last mod time and date

        $fr .= pack("V",0); // crc32 

        $fr .= pack("V",0); //compressed filesize 

        $fr .= pack("V",0); //uncompressed filesize 

        $fr .= pack("v", strlen($name) ); //length of pathname 

        $fr .= pack("v", 0 ); //extra field length 

        $fr .= $name;   

        // end of "local file header" segment

        // no "file data" segment for path

        // "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)); 

        // ext. file attributes mirrors MS-DOS directory attr byte, detailed 

        // at http://support.microsoft.com/support/kb/articles/Q125/0/19.asp

        // now add to central record 

        $cdrec = "\x50\x4b\x01\x02";  

        $cdrec .="\x00\x00";    // version made by 

        $cdrec .="\x0a\x00";    // version needed to extract 

        $cdrec .="\x00\x00";    // gen purpose bit flag 

        $cdrec .="\x00\x00";    // compression method 

        $cdrec .="\x00\x00\x00\x00"; // last mod time & date 

        $cdrec .= pack("V",0); // crc32 

        $cdrec .= pack("V",0); //compressed filesize 

        $cdrec .= pack("V",0); //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 

        $ext = "\x00\x00\x10\x00";  

        $ext = "\xff\xff\xff\xff";   

        $cdrec .= pack("V", 16 ); //external file attributes  - 'directory' 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 array 

        $this -> ctrl_dir[] = $cdrec;  

          

    } 


    function add_file($data, $name)   

    // adds "file" to archive    

    // $data - file contents 

    // $name - name of file in archive. Add path if your want

    {   

        $name = str_replace("\\", "/", $name);   

        //$name = str_replace("\\", "\\\\", $name);

        $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 .= "\x00\x00\x00\x00"; // last mod time and date

        $unc_len = strlen($data);   

        $crc = crc32($data);   

        $zdata = gzcompress($data);   

        $zdata = substr( substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug 

        $c_len = strlen($zdata);   

        $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;   

        // end of "local file header" segment 

          

        // "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 .="\x00\x00\x00\x00"; // 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 

//        echo "old offset is ".$this->old_offset.", new offset is $new_offset<br>"; 

        $this -> old_offset = $new_offset; 

        $cdrec .= $name;   

        // optional extra field, file comment goes here 

        // save to central directory 

        $this -> ctrl_dir[] = $cdrec;   

    } 

    function file() { // dump out file    

        $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 

    }  

}  

?>

#########################################################################

ziptest.php

<html>

<?php

include "./_inc/std_func.php";

include "./_inc/ziplib.php";

$curDir = $_GET[dir];

$rootDir = $_SERVER['DOCUMENT_ROOT'];

$workDir = $rootDir."/".$curDir."/";

$lastDir="";

$filesInDir = scandir($workDir);

foreach($filesInDir as $i => $fileName)

{

 if(is_dir($workDir.$fileName) && ($fileName[0]!='.'))

 {

  if(strcmp($lastDir, $fileName) < 0)

  {

   $lastDir=$fileName;

  }

 }

}

if(strlen($lastDir) > 0)

{

 $zipfile = new zipfile();

 $workDir = $workDir.$lastDir."/";

 $filesInDir = scandir($workDir);

 foreach($filesInDir as $i => $fileName)

 {

  if(is_dir($workDir.$fileName) && ($fileName[0]!='.'))

  {

   $zipfile->add_dir($fileName."/");

   $workDir2 = $workDir.$fileName."/";

   $files2InDir = scandir($workDir2);

   foreach($files2InDir as $i => $fileName2)

   {

    if(is_file($workDir2.$fileName2) && ($fileName2[0]!='.'))

    {

     $filedata = implode("", file($workDir2.$fileName2));

     $zipfile->add_file($filedata, $fileName."/".$fileName2);

    }

   }

  }

  else

  {

   if(is_file($workDir.$fileName))

   {

    $filedata = implode("", file($workDir."/".$fileName2));

    $zipfile->add_file($filedata, $fileName);

   }

  }

 }

 $ipAddr =$REMOTE_ADDR; //$_SERVER['REMOTE_ADDR'];

 $userAgent = $HTTP_USER_AGENT; //$_SERVER['HTTP_USER_AGENT'];

 if(preg_match("/compatible; MSIE/i", $userAgent)) //MS explorer

  header("Content-type: application/zip");

 else

  header("Content-type: application/octet-stream");

 header("Content-disposition: attachment; filename=$curDir.zip");

 header("Expires: 0");

 header("Cache-Control: must-reval!idate, post-check=0,pre-check=0");

 header("Pragma: public"); //IE doesn't work without this

 echo $zipfile->file();

}

else

{

 echo("<script language=\"javascript\">alert!(\"Can't find files!\"); history.go(-1);</script>");

}

?> 

</html>


저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by ocsoosoo
TAG , ,

댓글을 달아 주세요


티스토리 툴바