首頁  >  文章  >  後端開發  >  php ZIP壓縮類別實例分享

php ZIP壓縮類別實例分享

WBOY
WBOY原創
2016-07-25 09:13:07726瀏覽

功能:將檔案壓縮成zip,或是rar的壓縮包。後綴名可以自訂。 使用方法:先實例化,然後傳參。兩個參數。 第一個關於文件地址的一個Array。 第二個是要儲存的壓縮包檔案的絕對位址。

php zip壓縮類別的呼叫方法:

  1. $zipfiles =array("/root/pooy/test1.txt","/root/pooy/test2.txt" );
  2. $z = new PHPZip();
  3. //$randomstr = random(8);
  4. $zipfile = TEMP."/photocome_".$groupid.".zip";
  5. $z->Zip($zipfiles, $zipfile); //新增檔案清單
複製程式碼

PHP的ZIP壓縮類別:

  1. #

  2. # PHPZip v1.2 由 Sext (sext@neud.net) 2002-11 -18
  3. # (更改: 2003-03-01)
  4. #
  5. # 製作zip 文件
  6. #
  7. # 基於“Zip 檔案建立類別”,使用zLib
  8. #
  9. #
  10. class PHPZip
  11. {
  12. function Zip($dir, $zipfilename)
  13. {
  14. if (@function_exists('gzcompress'))
  15. {
  16. $wdcurdir = get🎜> $wdcurdir = getc( );
  17. if (is_array($dir))
  18. {
  19. $filelist = $dir;
  20. }
  21. else
  22. {
  23. $filelist = $this - > GetFileList( $dir);
  24. }
  25. if ((!empty($dir))&&(!is_array($dir))&&(file_exists($dir))) chdir($dir ) );

  26. else chdir($curdir);
  27. if (count($filelist)>0)

  28. {
  29. foreach($filelist as $filename)
  30. {
  31. if (is_file($filename))
  32. {
  33. $fd = fopen ($filename, "r");
  34. $content = fread ($fd, filesize ($filename)) ;
  35. fclose ($fd);
  36. if (is_array($dir)) $filename = basename($filename);

  37. $this ->; addFile($content, $filename);
  38. }
  39. }
  40. $out = $this ->;檔案();
  41. chdir($curdir);

  42. $fp = fopen($zipfilename, "w");
  43. fwrite($fp, $out, strlen($out));
  44. fclose($fp);
  45. }
  46. 回傳 1 ;
  47. }
  48. 否則回傳0;
  49. }
  50. function GetFileList($dir)

  51. {
  52. if (file_exists($dir))
  53. {
  54. $args = func_get_args();
  55. $pref = $args[1]; p>
  56. $dh = opendir($dir);

  57. while($files = readdir($dh))
  58. {
  59. if (($files!=".")&&($files!=".. "))
  60. {
  61. if (is_dir($dir. $files))
  62. {
  63. $curdir = getcwd();
  64. chdir($dir.$files);
  65. $file = array_merge($file, $this -> GetFileList("", "$pref$files/"));
  66. chdir($curdir);
  67. }
  68. else $file[]= $pref.$files;
  69. }
  70. }
  71. 已關閉($dh);
  72. }
  73. return $file;
  74. }
  75. var $datasec = array();

  76. var $ctrl_dir = array();
  77. var $eof_ctrl_dir = "x50x4bx05x06x00x00x00x00";
  78. var $old_offset = 0;
  79. ; /**

  80. * 將 Unix 時間戳記轉換為四位元組 DOS 日期和時間格式(日期
  81. * 在高兩個位元組中,時間在低兩個位元組中,允許大小比較)。
  82. *
  83. * @param 整數目前 Unix 時間戳
  84. *
  85. * @return 整數 四位元組 DOS 格式的目前日期
  86. *
  87. * @access private
  88. */
  89. 函數 unix2DosTime($unixtime = 0) {
  90. $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
  91. if ($timearray['year'] $timearray['year'] = 1980;

  92. $ $ timearray['mon'] = 1;
  93. $timearray['mday'] = 1;
  94. $timearray['分鐘''] = 0;
  95. $timearray['分鐘'] = 0;
  96. $timearray['秒'] = 0;
  97. } // 結束 if
  98. 回傳 (($timearray['year'] - 1980) ($timearray['hours'] > 1);

  99. }// 'unix2DosTime()' 方法結束
  100. /**

  101. * 將「檔案」新增至檔案
  102. *
  103. * @param string 檔案內容
  104. * @param string 檔案中檔案的名稱(可能包含路徑)
  105. * @param 整數目前時間戳
  106. *
  107. * @access public
  108. */
  109. function addFile($data, $name, $time = 0)
  110. {
  111. $name = str_replace('\', '/', $name);< ;/p>
  112. $dtime = dechex($this->unix2DosTime($time));

  113. $hexdtime = 'x' . $dtime[6] 。 $dtime[7]
  114. 西聯匯款點 。 'x' 。 $dtime[4] 。 $dtime[5]
  115. 。 'x' 。 $dtime[2] 。 $dtime[3]
  116. 。 'x' 。 $dtime[0] 。 $dtime[1];
  117. eval('$hexdtime = "' . $hexdtime . '";');
  118. $fr = "x50x4bx03x04";

  119. $fr . = "x14x00"; // 需要擷取
  120. $fr .= "x00x00"; // 產生目的位元標誌
  121. $fr .= "x08x00"; // 壓縮方法
  122. $fr .= $hexdtime ; // 最後修改時間與日期
  123. // 「本機檔案頭」區段

  124. $unc_len = strlen($data);
  125. $crc = crc32($data);
  126. $zdata = gzcompress($data);
  127. $c_len = strlen($zdata);
  128. $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2) ; // 修復crc 錯誤
  129. $fr .= pack('V', $crc); // crc32
  130. $fr .= pack('V', $c_len); // 壓縮檔案大小
  131. $fr .= pack('V', $unc_len); // 未壓縮的檔案大小
  132. $fr .= pack('v', strlen($name)); // 檔名長度
  133. $fr .= pack('v', 0); // 額外欄位長度
  134. $fr .= $name;
  135. // 「檔案資料」區段

  136. $fr .= $zdata;
  137. //「資料描述子」段(可選,但如果存檔不是

  138. // 作為檔案)
  139. $fr .= pack('V ', $crc); // crc32
  140. $fr .= pack('V', $c_len); // 壓縮檔案大小
  141. $fr .= pack('V', $unc_len); //未壓縮檔案大小
  142. // 將此項目加到陣列

  143. $this -> datasec[] = $fr;
  144. $new_offset = strlen(implode('', $ this->datasec));
  145. // 現在加入中央目錄記錄

  146. $cdrec = "x50x4bx01x02";
  147. $cdrec .= "x00x00"; // 由
  148. 建立的版本$cdrec .= "x14x00"; // 擷取所需的版本
  149. $cdrec .= "x00x00"; // 產生目的位元標誌
  150. $cdrec .= "x08x00"; //壓縮方法
  151. $cdrec .= $hexdtime; // 最後修改時間與日期
  152. $cdrec .= pack('V', $crc); // crc32
  153. $cdrec .= pack('V ', $c_len); // 壓縮檔案大小
  154. $cdrec .= pack('V', $unc_len); // 未壓縮的檔案大小
  155. $cdrec .= pack('v', strlen( $name) ); // 檔案名稱長度
  156. $cdrec .= pack('v', 0 ); // 額外欄位長度
  157. $cdrec .= pack('v', 0 ); // 文件註解長度
  158. $cdrec .= pack('v', 0 ); // 磁碟編號start
  159. $cdrec .= pack('v', 0 ); // 內部檔案屬性
  160. $cdrec . = pack('V', 32 ); // 外部檔案屬性- '存檔'位元設定
  161. ; $cdrec .= pack('V', $this -> old_offset ); / / 本地頭部的相對偏移

  162. $this -> old_offset = $new_offset;
  163. $cdrec .= $name;

  164. //可選的額外字段,文件註釋放在這裡

  165. // 保存到中心目錄
  166. $this -> ctrl_dir[] = $cdrec;
  167. }// 'addFile()' 方法結束
  168. ; /**

  169. * 轉儲檔案
  170. *
  171. * @return string 壓縮檔案
  172. *
  173. * @access public
  174. */
  175. function file()
  176. {
  177. $data = implode('', $this -> datasec);
  178. $ctrldir = implode('', $這-> ctrl_dir);
  179. 回傳

  180. $data .
  181. $ctrldir .
  182. $this -> eof_ctrl_dir .
  183. pack('v', sizeof($this -> ctrl_dir)) 。 // 「此磁碟上」的總條目數
  184. pack('v', sizeof($this -> ctrl_dir)) 。 // 總條目數
  185. pack('V', strlen($ctrldir)) . // 中央目錄的大小
  186. pack('V', strlen($data)) . // 到中央目錄開始的偏移量
  187. "x00x00"; // .zip 檔案註解長度
  188. } // 'file()' 方法結束
  189. } // 'PHPZip' 類別結束

  190. ?>
複製程式碼

老外實現的php zip壓縮類,個人感覺還是不錯的,裡面有大量php特別是函數pack、crc32、gzcompress等函數的應用,值得學習總結。



陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn