功能:將檔案壓縮成zip,或是rar的壓縮包。後綴名可以自訂。
使用方法:先實例化,然後傳參。兩個參數。
第一個關於文件地址的一個Array。
第二個是要儲存的壓縮包檔案的絕對位址。
php zip壓縮類別的呼叫方法:
-
-
$zipfiles =array("/root/pooy/test1.txt","/root/pooy/test2.txt" );
- $z = new PHPZip();
- //$randomstr = random(8);
- $zipfile = TEMP."/photocome_".$groupid.".zip";
- $z->Zip($zipfiles, $zipfile); //新增檔案清單
複製程式碼
PHP的ZIP壓縮類別:
-
-
#
- # PHPZip v1.2 由 Sext (sext@neud.net) 2002-11 -18
- # (更改: 2003-03-01)
- #
- # 製作zip 文件
- #
- # 基於“Zip 檔案建立類別”,使用zLib
- #
- #
- class PHPZip
- {
- function Zip($dir, $zipfilename)
- {
- if (@function_exists('gzcompress'))
- {
- $wdcurdir = get🎜> $wdcurdir = getc( );
- if (is_array($dir))
- {
- $filelist = $dir;
- }
- else
- {
- $filelist = $this - > GetFileList( $dir);
- }
if ((!empty($dir))&&(!is_array($dir))&&(file_exists($dir))) chdir($dir ) );
- else chdir($curdir);
if (count($filelist)>0)
- {
- foreach($filelist as $filename)
- {
- if (is_file($filename))
- {
- $fd = fopen ($filename, "r");
- $content = fread ($fd, filesize ($filename)) ;
- fclose ($fd);
if (is_array($dir)) $filename = basename($filename);
- $this ->; addFile($content, $filename);
- }
- }
- $out = $this ->;檔案();
chdir($curdir);
- $fp = fopen($zipfilename, "w");
- fwrite($fp, $out, strlen($out));
- fclose($fp);
- }
- 回傳 1 ;
- }
- 否則回傳0;
- }
function GetFileList($dir)
- {
- if (file_exists($dir))
- {
- $args = func_get_args();
- $pref = $args[1]; p>
$dh = opendir($dir);
- while($files = readdir($dh))
- {
- if (($files!=".")&&($files!=".. "))
- {
- if (is_dir($dir. $files))
- {
- $curdir = getcwd();
- chdir($dir.$files);
- $file = array_merge($file, $this -> GetFileList("", "$pref$files/"));
- chdir($curdir);
- }
- else $file[]= $pref.$files;
- }
- }
- 已關閉($dh);
- }
- return $file;
- }
var $datasec = array();
- var $ctrl_dir = array();
- var $eof_ctrl_dir = "x50x4bx05x06x00x00x00x00";
- var $old_offset = 0;
; /**
- * 將 Unix 時間戳記轉換為四位元組 DOS 日期和時間格式(日期
- * 在高兩個位元組中,時間在低兩個位元組中,允許大小比較)。
- *
- * @param 整數目前 Unix 時間戳
- *
- * @return 整數 四位元組 DOS 格式的目前日期
- *
- * @access private
- */
- 函數 unix2DosTime($unixtime = 0) {
- $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
if ($timearray['year'] $timearray['year'] = 1980;
- $ $ timearray['mon'] = 1;
- $timearray['mday'] = 1;
- $timearray['分鐘''] = 0;
- $timearray['分鐘'] = 0;
- $timearray['秒'] = 0;
- } // 結束 if
回傳 (($timearray['year'] - 1980) ($timearray['hours'] > 1);
- }// 'unix2DosTime()' 方法結束
/**
- * 將「檔案」新增至檔案
- *
- * @param string 檔案內容
- * @param string 檔案中檔案的名稱(可能包含路徑)
- * @param 整數目前時間戳
- *
- * @access public
- */
- function addFile($data, $name, $time = 0)
- {
- $name = str_replace('\', '/', $name);< ;/p>
$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 = "x50x4bx03x04";
- $fr . = "x14x00"; // 需要擷取
- $fr .= "x00x00"; // 產生目的位元標誌
- $fr .= "x08x00"; // 壓縮方法
- $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 -> datasec[] = $fr;
- $new_offset = strlen(implode('', $ this->datasec));
// 現在加入中央目錄記錄
- $cdrec = "x50x4bx01x02";
- $cdrec .= "x00x00"; // 由
- 建立的版本$cdrec .= "x14x00"; // 擷取所需的版本
- $cdrec .= "x00x00"; // 產生目的位元標誌
- $cdrec .= "x08x00"; //壓縮方法
- $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 ); // 磁碟編號start
- $cdrec .= pack('v', 0 ); // 內部檔案屬性
- $cdrec . = pack('V', 32 ); // 外部檔案屬性- '存檔'位元設定
; $cdrec .= pack('V', $this -> old_offset ); / / 本地頭部的相對偏移
- $this -> old_offset = $new_offset;
$cdrec .= $name;
//可選的額外字段,文件註釋放在這裡
- // 保存到中心目錄
- $this -> ctrl_dir[] = $cdrec;
- }// 'addFile()' 方法結束
; /**
- * 轉儲檔案
- *
- * @return string 壓縮檔案
- *
- * @access public
- */
- function file()
- {
- $data = implode('', $this -> datasec);
- $ctrldir = implode('', $這-> ctrl_dir);
回傳
- $data .
- $ctrldir .
- $this -> eof_ctrl_dir .
- pack('v', sizeof($this -> ctrl_dir)) 。 // 「此磁碟上」的總條目數
- pack('v', sizeof($this -> ctrl_dir)) 。 // 總條目數
- pack('V', strlen($ctrldir)) . // 中央目錄的大小
- pack('V', strlen($data)) . // 到中央目錄開始的偏移量
- "x00x00"; // .zip 檔案註解長度
- } // 'file()' 方法結束
} // 'PHPZip' 類別結束
- ?>
-
複製程式碼
老外實現的php zip壓縮類,個人感覺還是不錯的,裡面有大量php特別是函數pack、crc32、gzcompress等函數的應用,值得學習總結。
|