- /*
- 파일 이름: /include/zip.php
- 작성자: Horace 2009/04/15
- */
- class PHPZip{
- var $dirInfo = array("0","0");
- var $rootDir = '';
- var $datasec = 배열();
- var $ctrl_dir = 배열();
- 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, 파일 크기($filename));
- fclose($fd);
- if (is_array($dir)) $filename = basename($dir);
- $이것 -> addFile($fileValue, "$filename");
- }else{
- $this->dirTree($dir,$dir);
- }
- $zipfilenametemp = time().$zipfilename;
- $out = $this -> 파일zip();
- $fp = fopen($zipfilenametemp, "w");
- fwrite($fp, $out, strlen($out));
- fclose($fp);
- $filesize = 파일 크기($zipfilenametemp);
- if ($filesize < 104857600) {
- if($autoDownload){
- header("콘텐츠 유형: 애플리케이션/옥텟-스트림");
- header("Content-disposition: attachment; filename=".$zipfilename);
- }
- echo $this -> 파일zip();
- }else{
- echo "zip 생성 오류!";
- }
- unlink($zipfilenametemp);
- }
- }
- //dir 트리 가져오기..
- function dirTree($directory,$rootDir){
- global $_SERVER,$dirInfo,$rootDir;
- $fileDir=$rootDir;
- $myDir=dir($directory);
- while($file=$myDir->read()){
-
-
- if(is_dir("$directory/$file") 및 $file!="." 및 $file !=".."){
- $dirInfo[0] ;
- $rootDir ="$fileDir$file/";
- $이것 -> addFile('', "$rootDir");
- //n개의 폴더로 이동
- $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);
- $이것 -> addFile($fileValue, "$fileDir$file");
- }
- }
- }
- $myDir->close();
- }
- function unix2DosTime($unixtime = 0) {
- $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
- if ($timearray['연도'] < 1980) {
- $timearray['연도'] = 1980;
- $timearray['mon'] = 1;
- $timearray['mday'] = 1;
- $timearray['시간'] = 0;
- $timearray['분'] = 0;
- $timearray['초'] = 0;
-
-
- } //
- 이면 종료 return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
- ($timearray['hours'] << 11) | ($timearray['분'] << 5) | ($timearray['초'] >> 1);
- }
- function addFile($data, $name, $time = 0){
- $name = str_replace('//', '/', $name);
- $dtime = decex($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"; //
- $fr .= "/x00/x00";을 추출하는 데 필요한 버전입니다. // 생성 목적 비트 플래그
- $fr .= "/x08/x00"; // 압축 방법
- $fr .= $hexdtime; // 마지막 수정 시간 및 날짜
- // "로컬 파일 헤더" 세그먼트
- $unc_len = strlen($data);
- $crc = crc32($data);
- $zdata = gzcompress($data);
-
-
- $c_len = strlen($zdata);
- $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // crc 버그 수정
- $fr .= pack('V', $crc); // crc32
- $fr .= pack('V', $c_len); // 압축된 파일 크기
- $fr .= pack('V', $unc_len); // 압축되지 않은 파일 크기
- $fr .= pack('v', strlen($name)); // 파일 이름 길이
- $fr .= pack('v', 0); // 추가 필드 길이
- $fr .= $name;
- // "파일 데이터" 세그먼트
- $fr .= $zdata;
- // "데이터 설명자" 세그먼트(선택 사항이지만 아카이브가 아닌 경우 필요함
- // 파일로 제공됨)
- $fr .= pack('V', $crc); // crc32
- $fr .= pack('V', $c_len); // 압축된 파일 크기
- $fr .= pack('V', $unc_len); // 압축되지 않은 파일 크기
- // 이 항목을 배열에 추가합니다
- $this -> 데이터섹[] = $fr;
- $new_offset = strlen(implode('', $this->datasec));
- // 이제 중앙 디렉터리 레코드에 추가합니다.
- $cdrec = "/x50/x4b/x01/x02";
- $cdrec .= "/x00/x00"; //
- 에 의해 만들어진 버전 $cdrec .= "/x14/x00"; //
-
-
- 을 추출하는 데 필요한 버전 $cdrec .= "/x00/x00"; // 생성 목적 비트 플래그
- $cdrec .= "/x08/x00"; // 압축 방법
- $cdrec .= $hexdtime; // 마지막 수정 시간 및 날짜
- $cdrec .= pack('V', $crc); // crc32
- $cdrec .= pack('V', $c_len); // 압축된 파일 크기
- $cdrec .= pack('V', $unc_len); // 압축되지 않은 파일 크기
- $cdrec .= pack('v', strlen($name) ); // 파일 이름 길이
- $cdrec .= pack('v', 0 ); // 추가 필드 길이
- $cdrec .= pack('v', 0 ); // 파일 주석 길이
- $cdrec .= pack('v', 0 ); // 디스크 번호 시작
- $cdrec .= pack('v', 0 ); // 내부 파일 속성
- $cdrec .= pack('V', 32 ); // 외부 파일 속성 - '아카이브' 비트 세트
- $cdrec .= pack('V', $this -> old_offset ); // 로컬 헤더의 상대 오프셋
- $this -> old_offset = $new_offset;
- $cdrec .= $이름;
- // 선택적 추가 필드, 파일 설명은 여기에 표시됩니다.
- // 중앙 디렉터리에 저장
- $this -> ctrl_dir[] = $cdrec;
- }
- function filezip(){
- $data = implode('', $this -> datasec);
- $ctrldir = implode('', $this -> ctrl_dir);
-
- $data를 반환합니다.
- $ctrldir .
- $이것 -> eof_ctrl_dir .
- pack('v', sizeof($this -> ctrl_dir)) . // "이 디스크에 있는" 항목의 총 개수
- pack('v', sizeof($this -> ctrl_dir)) . // 전체 항목의 총 개수
- pack('V', strlen($ctrldir)) . // 중앙 디렉토리의 크기
- pack('V', strlen($data)) . // 중앙 디렉토리 시작 오프셋
- "/x00/x00"; // .zip 파일 주석 길이
- }
- }
- ?>
-
-
-
- 还有另외일个比较简单적
-
- [php] 일반 사본 보기
-
-
- 클래스 createzip
- {
- /* @압축된 zip 파일을 생성합니다.
- * @destination 目标文件的路径 如"c:/androidyue.zip"
- * @$overwrite 是否为覆盖与目标文件상동문件
- * @Recorded By Androidyue
- * @Blog: http://thinkblog.sinaapp.com
- */
- function create_zip($files = array(),$destination = '',$overwrite = false)
- {
- //如果zip文件已经存在并且设置为不返回false
- if(file_exists($destination) && !$overwrite) { return false; }
- $valid_files = array();
- //파일이 전달된 경우...
- //실제 유효한 파일 이름 가져오기
- if(is_array($files)) {
- //각 파일을 순환
- foreach($files as $file) {
- //파일이 존재하는지 확인
- if(file_exists($file)) {
- $valid_files[] = $file ;
- }
- }
- }
- //실제 유효한 파일이 있는 경우
- if(count($valid_files))
- {
- //아카이브 생성
- $zip = new ZipArchive();
- //파일을 엽니다. 파일이 이미 있으면 덮어씁니다.
- if($zip->open($destination,$overwrite) ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE ::CREATE) !== true) {
- return false;
- }
- //압축 파일에 파일 추가
- foreach($valid_files as $file) {
- $zip-> ;addFile($file,$file);
- }
- //파일 닫기
- $zip->close()
- //파일이 있는지 확인 exists
- return file_exists($destination );
- }
- else{
- //실제 유효한 파일이 없으면 false를 반환합니다.
- return false;
-
- }
- /* ***
- //테스트 함수
- $files=array('temp.php','test.php')
- create_zip($files, 'myzipfile.zip', true); ****/
- ?>
-
-
- 코드 복사
|
압축파일, php