首頁 >後端開發 >php教程 >php壓縮檔案幫助類

php壓縮檔案幫助類

WBOY
WBOY原創
2016-07-25 08:45:341366瀏覽
複製程式碼
  1. /*
  2. 檔名:/include/zip.php
  3. 作者:Horace 2009/04/15
  4. */
  5. */
  6. class PHPZip{
  7. var $dirInfo = array("0","0");
  8. var $rootDir = '';
  9. var $datasec = array();
  10. var $ctrl_dir = array();
  11. var $eof_ctrl_dir = "/x50/x4b/x05/x06/x00/x00/x00/x00";
  12. var $old_offset = 0;
  13. function downloadZip(){
  14. createZip($dir, $zipfilename, true);
  15. }
  16. function createZip($dir, $zipfilename, $autoDownload = false){
  17. if (@function_exists('gzcompress')){
  18. @set_time_limit("0");
  19. if (is_array($dir)){
  20. $fd = fopen ($dir, "r");
  21. $fileValue = fread ($fd, 檔案大小 ($filename));
  22. fclose ($fd);
  23. if (is_array($dir)) $filename = basename($dir);
  24. $這個 -> addFile($fileValue, "$filename");
  25. }else{
  26. $this->dirTree($dir,$dir);
  27. }
  28. $zipfilenametemp = time().$zipfilename;
  29. $out = $this -> $out = $this -> $out = $this -> $out = $this ->檔案壓縮();
  30. $fp = fopen($zipfilenametemp, "w" );
  31. fwrite($fp, $out, strlen($out));
  32. fclose($fp);
  33. $filesize = filesize($zipfilenametemp);
  34. if ($filesize if($autoDownload){
  35. header("內容類型:應用程式/八位元組流");
  36. header("內容配置:附件; filename=".$zipfilename);
  37. }
  38. echo $this ->檔案壓縮();
  39. }else{
  40. echo "建立壓縮錯誤!";
  41. }
  42. 取消連結($zipfilenametemp);
  43. }
  44. }
  45. //取得目錄樹..
  46. function dirTree($directory,$rootDir){
  47. global $_SERVER,$dirInfo,$rootDir;
  48. $fileDir=$rootDir;
  49. $myDir=dir($directory);
  50. while($file=$myDir->read()){
  51. if(is_dir("$directory/$file") 和 $file!="." 和 $file ! =".."){
  52. $dirInfo[0] ;
  53. $rootDir ="$fileDir$file/";
  54. $這個 -> addFile('', "$rootDir");
  55. // 繼續 n 的資料夾
  56. $this->dirTree("$directory/$file",$rootDir);
  57. }else{
  58. if($file!="." 和 $file!=".."){
  59. $dirInfo[1] ;
  60. //$fd = fopen("$directory/$file", "r");
  61. $fileValue = file_get_contents("$directory/$file");
  62. //fclose ($fd);
  63. $這個 -> addFile($fileValue, "$fileDir$file");
  64. }
  65. }
  66. }
  67. $myDir->close();
  68. }
  69. function unix2DosTime($unixtime = 0) {
  70. $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
  71. if ($timearray['year'] $timearray['year'] = 1980;
  72. $timearray['mon'] = 1;
  73. $timearray['mday'] = 1;
  74. $timearray['小時'] = 0;
  75. $timearray['分鐘'] = 0;
  76. $timearray['秒'] = 0;
  77. } // 結束 if
  78. return (($timearray['year'] - 1980) ($timearray['小時'] >1); }
  79. function addFile($data, $name, $time = 0){
  80. $name = str_replace('//', '/', $name);
  81. $dtime = dechex($this- >unix2DosTime($time));
  82. $hexdtime = '/x' 。 $dtime[6] 。 $dtime[7]
  83. . '/x' 。 $dtime[4] 。 $dtime[5]
  84. . '/x' 。 $dtime[2] 。 $dtime[3]
  85. . '/x' 。 $dtime[0] 。 $dtime[1];
  86. eval('$hexdtime = "' . $hexdtime . '";');
  87. $fr = "/x50/x4b/x03/x04";
  88. $fr . = "/x14/x00"; // ver 需要擷取
  89. $fr .= "/x00/x00"; // 產生目的位元標誌
  90. $fr .= "/x08/x00"; // 壓縮方法
  91. $fr .= $hexdtime; // 最後修改時間和日期
  92. // “本地文件頭”段
  93. $unc_len = strlen($data);
  94. $crc = crc32($ data);
  95. $zdata = gzcompress($data);
  96. $c_len = strlen($zdata);
  97. $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 錯誤
  98. $fr .= pack('V', $crc); // crc32
  99. $fr .= pack('V', $c_len ); // 壓縮檔案大小
  100. $fr .= pack('V', $unc_len); // 未壓縮的檔案大小
  101. $fr .= pack('v', strlen($name)) ; // 檔案名稱長度
  102. $fr .= pack('v', 0); // 額外欄位長度
  103. $fr .= $name;
  104. // 「檔案資料」區段
  105. $fr .= $zdata;
  106. // “資料描述符”段(可選,但如果存檔不是
  107. // 作為文件則必需)
  108. $fr .= pack('V', $ crc); // crc32
  109. $fr .= pack('V', $c_len); // 壓縮檔案大小
  110. $fr .= pack('V', $unc_len); // 未壓縮的檔案大小
  111. // 將此條目加入陣列
  112. $this ->資料安全[] = $fr;
  113. $new_offset = strlen(implode('', $this->datasec));
  114. // 現在加入中央目錄記錄
  115. $cdrec = "/x50/x4b/x01/x02";
  116. $cdrec .= "/x00/x00"; //
  117. 製作的版本$ cdrec .= "/x14/x00"; // 提取所需的版本
  118. $cdrec .= "/x00/x00"; // 產生目的位元標誌
  119. $cdrec .= "/x08/x00"; // 壓縮方法
  120. $cdrec .= $hexdtime; // 最後修改時間與日期
  121. $cdrec .= pack('V', $crc); // crc32
  122. $cdrec .= pack('V', $c_len); // 壓縮檔案大小
  123. $cdrec .= pack('V', $unc_len); // 未壓縮的檔案大小
  124. $cdrec . = pack('v', strlen($name) ); // 檔案名稱長度
  125. $cdrec .= pack('v', 0 ); // 額外欄位長度
  126. $cdrec .= pack(' v', 0 ); // 檔案註解長度
  127. $cdrec .= pack('v', 0 ); // 磁碟編號開始
  128. $cdrec .= pack('v', 0 ); //內部檔案屬性
  129. $cdrec .= pack('V', 32 ); // 外部檔案屬性- 'archive' 位元設定
  130. $cdrec .= pack('V', $this -> old_offset ); // 本地頭部的相對偏移
  131. $this ->舊偏移量= $新偏移量;
  132. $cdrec .= $name;
  133. // 可選的額外字段,文件註釋位於此處
  134. // 儲存到中央目錄
  135. $this -> ctrl_dir[] = $cdrec;
  136. }
  137. function filezip(){
  138. $data = implode('', $ this -> datasec);
  139. $ctrldir = implode('', $this -> ctrl_dir);
  140. 回傳
  141. $data 。
  142. $ctrldir 。
  143. $這個 -> eof_ctrl_dir 。
  144. pack('v', sizeof($this -> ctrl_dir)) 。 // 「此磁碟上」的總條目
  145. pack('v', sizeof($this -> ctrl_dir)) . // 總體條目總數
  146. pack('V', strlen($ctrldir)) . // 中央目錄的大小
  147. pack('V', strlen($data)) . // 到中央目錄開始的偏移量
  148. "/x00/x00"; // .zip 檔案註解長度
  149. }
  150. }
  151. ?>
  152. 還有另外一個比較簡單的
  153. [php] view plaincopy
  154. [php] view plaincopy
  155. [php] view plaincopy
  156. php
  157. class createzip
  158. {
  159. /* @建立一個壓縮的zip檔案將多個檔案壓縮成一個zip檔案的函數
  160. * @$files 備份類型實例array("1 .jpg","2.jpg");
  161. * @destination 目標檔案的路徑如"c:/androidyue.zip"
  162. * @$overwrite 是否覆寫與目標檔案相同的檔案
  163. * @ 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; }
  164. $valid_files = array();
  165. //if files were passed in...
  166. //取得到真實有效的檔名
  167. if(is_array($files)) {
  168. //cycle through each file
  169. foreach($files as $file) {
  170. //make sure the file exists
  171. if(file_exists($file)) {
  172. $valid_files[] = $file_exists($file)) {
  173. $valid_files[] = $file ;
  174. }
  175. }
  176. }
  177. //如果存在真實有效的檔案
  178. if(count($valid_files))
  179. {
  180. //create the archive
  181. $zip = new ZipArchive();
  182. //開啟檔案如果檔案已經存在則覆蓋,如果沒有則建立
  183. if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE: :CREATE) !== true) {
  184. return false;
  185. }
  186. //向壓縮檔案中新增檔案
  187. foreach($valid_files as $file) {
  188. $zip->addFile ($file,$file);
  189. }
  190. //關閉檔案
  191. $zip->close();
  192. //偵測檔案是否存在
  193. return file_exists($destination);
  194. }
  195. else{
  196. //如果沒有真實有效的檔案回傳false
  197. return false;
  198. }
  199. }
  200. }
  201. /**
  202. }
  203. }
  204. /****
//測試函數
$files=array('temp.php','test.php'); create_zip($files, 'myzipfile.zip', true); ****/
?>
壓縮檔案, php


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