- /*
- 檔名:/include/zip.php
- 作者: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, 檔案大小 ($filename));
- fclose ($fd);
- if (is_array($dir)) $filename = basename($dir);
- $這個 -> addFile($fileValue, "$filename");
- }else{
- $this->dirTree($dir,$dir);
- }
- $zipfilenametemp = time().$zipfilename;
- $out = $this -> $out = $this -> $out = $this -> $out = $this ->檔案壓縮();
- $fp = fopen($zipfilenametemp, "w" );
- fwrite($fp, $out, strlen($out));
- fclose($fp);
- $filesize = filesize($zipfilenametemp);
- if ($filesize if($autoDownload){
- header("內容類型:應用程式/八位元組流");
- header("內容配置:附件; filename=".$zipfilename);
- }
- echo $this ->檔案壓縮();
- }else{
- echo "建立壓縮錯誤!";
- }
- 取消連結($zipfilenametemp);
- }
- }
- //取得目錄樹..
- 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!="." 和 $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['year'] $timearray['year'] = 1980;
- $timearray['mon'] = 1;
- $timearray['mday'] = 1;
- $timearray['小時'] = 0;
- $timearray['分鐘'] = 0;
- $timearray['秒'] = 0;
-
-
- } // 結束 if
- return (($timearray['year'] - 1980) ($timearray['小時'] >1); }
- function addFile($data, $name, $time = 0){
- $name = str_replace('//', '/', $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 需要擷取
- $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 = substr(substr($zdata, 0, strlen(> $zdata = substr(substr($zdata, 0, strlen(> $zdata = substr(substr($zdata, 0, strlen(> $zdata = substr(substr($zdata, 0, strlen(> 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 ); // 外部檔案屬性- 'archive' 位元設定
- $cdrec .= pack('V', $this -> old_offset ); // 本地頭部的相對偏移
- $this ->舊偏移量= $新偏移量;
- $cdrec .= $name;
- // 可選的額外字段,文件註釋位於此處
- // 儲存到中央目錄
- $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] view plaincopy
-
-
- [php] view plaincopy
-
-
- [php] view plaincopy
-
- php
-
- class createzip
- {
- /* @建立一個壓縮的zip檔案將多個檔案壓縮成一個zip檔案的函數
- * @$files 備份類型實例array("1 .jpg","2.jpg");
- * @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 files were passed in...
- //取得到真實有效的檔名
- if(is_array($files)) {
- //cycle through each file
- foreach($files as $file) {
- //make sure the file exists
- if(file_exists($file)) {
- $valid_files[] = $file_exists($file)) {
- $valid_files[] = $file ;
- }
- }
- }
- //如果存在真實有效的檔案
- if(count($valid_files))
- {
- //create the archive
- $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();
- //偵測檔案是否存在
- return file_exists($destination);
- }
- else{
- //如果沒有真實有效的檔案回傳false
- return false;
- }
- }
-
- }
- /**
- }
-
- }
- /****
//測試函數 $files=array('temp.php','test.php'); create_zip($files, 'myzipfile.zip', true); ****/ ?>
|
複製程式碼