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>
'programmer > web script' 카테고리의 다른 글
[php]폴더 생성(상위 폴더 자동 생성) (1) | 2011.08.01 |
---|---|
[php]파일 및 폴더 찾아서 정리하기 (0) | 2011.08.01 |
[java script]Scroll menu(스크롤바 따라다니는 메뉴) (0) | 2011.08.01 |
[java script]그라데이션(Gradation) 처리 (0) | 2011.08.01 |
apache & jsp & php & mysql 설치 및 설정 (0) | 2011.08.01 |