這段php類別可以挨個加入檔案到數組,最後將新增的檔案打包成zip
- /* $Id: zip.lib.php,v 1.1 2004/02/14 15:21:18 anoncvs_tusedb Exp $ */
- // vim: Expandtab sw= 4 ts=4 sts=4:
-
-
- /**
- * Zip 檔案建立類別。
- * 製作 zip 檔案。
- *
- * 最後修改與擴充功能者:
- *
- * Hasin Hayder
- * 首頁: www.hasinme .info
- * 電子郵件:countdraculla@gmail.com
- * IDE:PHP Designer 2005
- *
- *
- * 最初基於:
- *
- * http:// www.zend.com/codex.php?id=535&single=1
- * 作者:Eric Mueller
- *
- * http://www.zend.com/codex。 php?id=470&single=1
- * 由Denis125
- *
- * 來自Peter Listiak 的補丁最後修改
- * 壓縮檔案的日期和時間
- *
- * 官方ZIP 檔案格式:http://www.pkware.com/appnote.txt
- *
- * @access公開
- */
- class zipfile
- {
- /**
- * 儲存壓縮資料的陣列
- *
- * @public array $datasec
- */
- public $ datasec = array();
-
- /**
- * 中央目錄
- *
- * @public array $ctrl_dir
- */
- public $ctrl_dir = array();
-
- /**
- * 中央目錄記錄結束
- *
- * @public string $eof_ctrl_dir
- */
- public $ eof_ctrl_dir = "x50x4bx05x06x00x00x00x00";
-
- /**
- * 最後偏移位置
- *
- * @public integer $old_offset
- */
- public $old_offset = 0;
-
- $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
-
- if ($timearray['year'] $timearray['year'] = 1980;
- $timearray[' montimearray[' montimearray[' montimearray[' montimearray” '] = 1;
- $timearray['mday'] = 1;
- $timearray['小時'] = 0;
- $timearray['分鐘'] = 0;
- $timearray [ 'seconds'] = 0;
- } // 結束if
-
- return (($timearray['year'] - 1980) ($timearray['hours'] > 1);
- }// 'unix2DosTime()' 方法結束
-
-
- /**
- * 將「檔案」新增至檔案
- *
- * @param string 檔案內容
- * @param string 檔案中檔案的名稱(可能包含路徑)
- * @param 整數目前時間戳
- *
- * @access public
- */
- 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 = "x50x4bx03x04";
- $fr .= "x14x00" ; // 需要擷取
- $fr .= "x00x00"; // 產生目的位元標誌
- $fr .= "x08x00"; // 壓縮方法
- $fr .= $hexdtime; // 最後修改時間和日期
-
- // “本地文件頭”段
- $unc_len = strlen($data);
- $crc = crc32($data);
- $zdata = gzcompress( $data);
- $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // 修正crc 錯誤
- $c_len = strlen($zdata);
- $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;
-
- // 現在加入中央目錄記錄
- $cdrec = "x50x4bx01x02";
- $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 ); // 外部檔案屬性- 'archive' 位元設定
-
- $cdrec .= pack('V', $this -> old_offset ) ; // 本地標頭的相對偏移
- $this -> old_offset = strlen($fr);
-
- $cdrec .= $name;
-
- // 可選的額外字段,文件註釋位於此處
- // 保存到中央目錄
- $這個-> ctrl_dir[] = $cdrec;
- } // 'addFile()' 方法結束
-
-
- /**
- * 轉儲檔案
- *
- * @return string 壓縮檔案
- *
- * @access public
- */
- function file()
- {
- $data = implode('', $this -> datasec);
- $ctrldir = implode('' , $this -> ctrl_dir);
-
- return
- $data .
- $ctrldir .
- $this -> eof_ctrl_dir .
- pack('v', packsizef$ - > ctrl_dir)) 。 // 「此磁碟上」的總條目數
- pack('v', sizeof($this -> ctrl_dir)) 。 // 總條目數
- pack('V', strlen($ctrldir)) . // 中央目錄的大小
- pack('V', strlen($data)) . // 到中央目錄開始的偏移量
- "x00x00"; // .zip 檔案註解長度 }// 'file()' 方法結束
-
-
- /**
- * 原始addFile 函數的包裝
- *
- * 由Hasin Hayder 在1 月29 日凌晨1:29 建立
- *
- * @param array 具有相對/絕對路徑的檔案數組要加入Zip 檔案
- *
- * @access public
- */
- function addFiles($files /*只傳遞陣列*/)
- {
- foreach ($files as $file)
- {
- if (is_file($file)) //目錄檢查
- {
- $data = implode("",file($file));
- $this->addFile($data,$file);
- }
- }
- }
-
- /**
- * 原始檔案函數的包裝
- *
- * 由Hasin Hayder 在1 月29 日凌晨1:29 建立
- *
- * @param string 輸出檔案名稱
- *
- * @access public
- */
- 函數輸出($檔)
- {
- $fp=fopen($file,"w");
- fwrite($fp,$this->file());
- fclose($fp);
- }
-
-
-
- } // 'zipfile' 類別的結尾
複製程式碼
|