首頁  >  文章  >  後端開發  >  PHPZip的使用

PHPZip的使用

WBOY
WBOY原創
2016-07-25 08:42:25843瀏覽
  1. class PHPZip
  2. {
  3. function Zip($dir, $zipfilename)
  4. {
  5. if (@function_exists('gzcompress') $curdir = getcwd();
  6. if (is_array($dir))
  7. {
  8. $filelist = $dir;
  9. }
  10. else
  11. {
  12. {
  13. > $文件列表=$這個->; GetFileList($dir);
  14. }
  15. if ((!empty($dir))&&(!is_array($dir))&&(file_exists($dir))) chdir($dir);
  16. else chdir($curdir);
  17. if (count($filelist)>0)
  18. {
  19. foreach($filelist as $filename)
  20. {
  21. if ( is_file($filename))
  22. {
  23. $fd = fopen ($filename, "r");
  24. $content = fread ($fd, filesize ($filename));
  25. fclose ( $ fd);
  26. if (is_array($dir)) $filename = basename($filename);
  27. $this ->; addFile($content, $filename);
  28. }
  29. }
  30. $out = $this ->; file();
  31. chdir($curdir);
  32. $fp = fopen($zipfilename, "w");
  33. fwrite($fp, $out, strlen($out));
  34. fclose($fp);
  35. }
  36. return 1;
  37. }
  38. else return 0;
  39. }
  40. function GetFileList($dir)
  41. {
  42. if (file_exists($dir))
  43. {
  44. $args = func_get_args();
  45. $pref = $args[1];
  46. $dh = opendir($dir ) ) );
  47. while($files = readdir($dh))
  48. {
  49. if (($files!=".")&&($files!=".."))
  50. {
  51. if (is_dir($dir.$files))
  52. {
  53. $curdir = getcwd();
  54. chdir($dir.$files);
  55. $file = array_merge( $檔, $this -> GetFileList("", "$pref$files/"));
  56. chdir($curdir);
  57. }
  58. else $file[]=$pref.$files;
  59. }
  60. }
  61. closedir($dh);
  62. }
  63. return $file;
  64. }
  65. var $datasec = array();
  66. var $ ctrl_dir = array();
  67. var $eof_ctrl_dir = "x50x4bx05x06x00x00x00x00";
  68. var $old_offset = 0m
  69. 0 ) {
  70. $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
  71. if ($timearray['year'] $timearray['year'] = 1980;
  72. $timearray[' montimearray[' montimearray[' montimearray[' montimearray” '] = 1;
  73. $timearray['mday'] = 1;
  74. $timearray['小時'] = 0;
  75. $timearray['分鐘'] = 0;
  76. $timearray [ 'seconds'] = 0;
  77. } // 結束if
  78. return (($timearray['year'] - 1980) ($timearray['hours'] > 1);
  79. }// 'unix2DosTime()' 方法結束
  80. /**
  81. * 將「檔案」新增至檔案
  82. *
  83. * @param string 檔案內容
  84. * @param string 檔案中檔案的名稱(可能包含路徑)
  85. * @param 整數目前時間戳
  86. *
  87. * @access public
  88. */
  89. function addFile($data, $name, $time = 0)
  90. {
  91. $name = str_replace('', '/', $name);
  92. $dtime = dechex($this->unix2DosTime($time));
  93. $hexdtime = 'x' 。 $dtime[6] 。 $dtime[7]
  94. 。 'x' 。 $dtime[4] 。 $dtime[5]
  95. 。 'x' 。 $dtime[2] 。 $dtime[3]
  96. 。 'x' 。 $dtime[0] 。 $dtime[1];
  97. eval('$hexdtime = "' . $hexdtime . '";');
  98. $fr = "x50x4bx03x04";
  99. $fr .= "x14x00" ; // ver 需要擷取
  100. $fr .= "x00x00"; // 產生目的位元標誌
  101. $fr .= "x08x00"; // 壓縮方法
  102. $fr .= $hexdtime; //最後修改時間和日期
  103. // “本地文件頭”段
  104. $unc_len = strlen($data);
  105. $crc = crc32($data);
  106. $zdata = gzcompress ($data);
  107. $c_len = strlen($zdata);
  108. $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // 修正crc 錯誤
  109. $fr .= pack('V', $crc); // crc32
  110. $fr .= pack('V', $c_len); // 壓縮檔案大小
  111. $fr .= pack( 'V', $unc_len); // 未壓縮的檔案大小
  112. $fr .= pack('v', strlen($name)); // 檔案名稱長度
  113. $fr .= pack(' v', 0); // 額外欄位長度
  114. $fr .= $name;
  115. // 「檔案資料」區段
  116. $fr .= $zdata;
  117. // 「資料描述子」段(可選,但如果檔案不是
  118. // 作為檔案)
  119. $fr .= pack('V', $crc); // crc32
  120. $fr . = pack('V', $c_len); // 壓縮檔案大小
  121. $fr .= pack('V', $unc_len); // 未壓縮的檔案大小
  122. // 將此條目加入陣列
  123. $this ->; datasec[] = $fr;
  124. $new_offset = strlen(implode('', $this->datasec));
  125. // 現在加入到中央目錄記錄
  126. $cdrec = " x50x4bx01x02";
  127. $cdrec .= "x00x00"; // 由
  128. 建立的版本$cdrec .= "x14x00"; // 提取所需的版本
  129. $cdrec .= "x00x00"; // 產生目的位元標誌
  130. $cdrec .= "x08x00"; // 壓縮方法
  131. $cdrec .= $hexdtime; // 最後修改時間與日期
  132. $cdrec .= pack('V', $crc); // crc32
  133. $cdrec .= pack('V', $c_len); // 壓縮檔案大小
  134. $cdrec .= pack(' V', $unc_len); // 未壓縮的檔案大小
  135. $cdrec .= pack('v', strlen($name) ); // 檔案名稱長度
  136. $cdrec .= pack('v ', 0 ); // 額外欄位長度
  137. $cdrec .= pack('v', 0 ); // 檔案註解長度
  138. $cdrec .= pack('v', 0 ); // 磁碟編號start
  139. $cdrec .= pack('v', 0 ); // 內部檔案屬性
  140. $cdrec .= pack('V', 32 ); // 外部檔案屬性- 'archive' 位元設定
  141. $cdrec .= pack('V', $this -> old_offset ); // 本地頭部的相對偏移
  142. $this -> old_offset = $new_offset;
  143. $cdrec .= $name;
  144. // 可選額外字段,文件註釋位於此處
  145. // 保存到中央目錄
  146. $this -> ; ctrl_dir[] = $cdrec;
  147. } // 'addFile()' 方法結束
  148. /**
  149. * 轉儲檔案
  150. *
  151. * @return string 壓縮檔案
  152. *
  153. * @access public
  154. */
  155. function file()
  156. {
  157. $data = implode(' ', $this -> datasec);
  158. $ctrldir = implode('', $this -> ctrl_dir);
  159. return
  160. $data .
  161. $ctrldir .
  162. $
  163. $ this -> eof_ctrl_dir .
  164. pack('v', sizeof($this -> ctrl_dir)) 。 // 「此磁碟上」的總條目
  165. pack('v', sizeof($this -> ctrl_dir)) . // 條目總數
  166. pack('V', strlen($ctrldir)) . / / 中央目錄的大小
  167. pack('V', strlen($data)) . // 到中央目錄開始的偏移量
  168. "x00x00"; // .zip 檔案註解長度
  169. } / / 'file()' 方法結束
  170. }// end of the 'PHPZip' class
  171. ?>
  172. //使用方法
  173. $z = new PHPZip(); //新建立一個zip的類別
  174. 方法一:
  175. $z -> Zip("", "out1.zip"); //新增目前目錄和子目錄下的所有檔案
  176. 方法二:
  177. $files=array('1.txt','gb.txt');
  178. $files[]='5.txt';
  179. $z -> Zip($files, "out2.zip"); //新增檔案清單
  180. 方法三:
  181. $z -> Zip("/usr/local/sext/", "out3.zip"); //新增指定目錄
  182. ?>
複製程式碼

PHPZip


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