ホームページ  >  記事  >  バックエンド開発  >  php圧縮ファイルのヘルプクラス

php圧縮ファイルのヘルプクラス

WBOY
WBOYオリジナル
2016-07-25 08:45:341342ブラウズ
  1. /*
  2. ファイル名: /include/zip.php
  3. 著者: Horace 2009/04/15
  4. */
  5. class PHPZip{
  6. var $dirInfo = array("0","0 ");
  7. var $rootDir = '';
  8. var $datasec = array();
  9. var $ctrl_dir = array();
  10. var $eof_ctrl_dir = "/x50/x4b/x05/x06/x00/x00/x00/x00";
  11. var $old_offset = 0;
  12. function downloadZip(){
  13. createZip($dir, $zipfilename, true);
  14. }
  15. function createZip($dir, $zipfilename, $autoDownload = false){
  16. if (@function_exists('gzcompress')){
  17. @set_time_limit("0");
  18. if (is_array($dir)){
  19. $fd = fopen ($dir, "r");
  20. $fileValue = fread ($fd, ファイルサイズ ($filename));
  21. fclose ($fd);
  22. if (is_array($dir)) $filename = Basename($dir);
  23. $this -> addFile($fileValue, "$ファイル名");
  24. }else{
  25. $this->dirTree($dir,$dir);
  26. }
  27. $zipfilenametemp = time().$zipfilename;
  28. $out = $this ->ファイルzip();
  29. $fp = fopen($zipfilenametemp, "w");
  30. fwrite($fp, $out, strlen($out));
  31. fclose($fp);
  32. $filesize = ファイルサイズ($zipfilenametemp);
  33. if ($filesize < 104857600) {
  34. if($autoDownload){
  35. header("Content-type: application/octet-stream");
  36. header("Content-disposition:attachment; filename=".$zipfilename);
  37. }
  38. echo $this ->ファイルzip();
  39. }else{
  40. echo "zip エラーの作成!";
  41. }
  42. unlink($zipfilenametemp);
  43. }
  44. }
  45. //ディレクトリツリーを取得..
  46. function dirTree($directory,$rootDir){
  47. global $_SERVER,$dirInfo,$rootDir;
  48. $fileDir=$rootDir;
  49. $myDir=dir($ディレクトリ);
  50. while($file=$myDir->read()){
  51. if(is_dir("$directory/$file") and $file!="." and $file!=".."){
  52. $dirInfo[0]++;
  53. $rootDir ="$fileDir$file/";
  54. $this -> addFile('', "$rootDir");
  55. //n のフォルダーに移動します
  56. $this->dirTree("$directory/$file",$rootDir);
  57. }else{
  58. if($file!="." and $file!=".."){
  59. $dirInfo[1]++;
  60. //$fd = fopen ("$ディレクトリ/$ファイル", "r");
  61. $fileValue = file_get_contents("$ディレクトリ/$ファイル");
  62. //fclose ($fd);
  63. $this -> addFile($fileValue, "$fileDir$file");
  64. }
  65. }
  66. }
  67. $myDir->close();
  68. }
  69. 関数 unix2DosTime($unixtime = 0) {
  70. $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
  71. if ($timearray['year'] < 1980) {
  72. $timearray['year'] = 1980;
  73. $timearray['mon'] = 1;
  74. $timearray['mday'] = 1;
  75. $timearray['時間'] = 0;
  76. $timearray['分'] = 0;
  77. $timearray['秒'] = 0;
  78. } // end if
  79. return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
  80. ($timearray['hours'] << 11) | ($timearray['分'] << 5) | ($timearray['秒'] >> 1);
  81. }
  82. 関数 addFile($data, $name, $time = 0){
  83. $name = str_replace('//', '/', $name);
  84. $dtime = dechex($this->unix2DosTime($time));
  85. $hexdtime = '/x' 。 $dtime[6] 。 $dtime[7]
  86. . '/バツ' 。 $dtime[4] 。 $dtime[5]
  87. . '/バツ' 。 $dtime[2] 。 $dtime[3]
  88. . '/バツ' 。 $dtime[0] 。 $dtime[1];
  89. eval('$hexdtime = "' . $hexdtime . '";');
  90. $fr = "/x50/x4b/x03/x04";
  91. $fr .= "/x14/x00"; //
  92. を抽出するために必要なバージョン $fr .= "/x00/x00"; // 生成目的ビットフラグ
  93. $fr .= "/x08/x00"; // 圧縮方法
  94. $fr .= $hexdtime; // 最終更新日時
  95. // 「ローカル ファイル ヘッダー」セグメント
  96. $unc_len = strlen($data);
  97. $crc = crc32($data);
  98. $zdata = gzcompress($data);
  99. $c_len = strlen($zdata);
  100. $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // crc バグを修正
  101. $fr .= Pack('V', $crc); // crc32
  102. $fr .= Pack('V', $c_len); // 圧縮ファイルサイズ
  103. $fr .= Pack('V', $unc_len); // 非圧縮ファイルサイズ
  104. $fr .= Pack('v', strlen($name)); // ファイル名の長さ
  105. $fr .= Pack('v', 0); // 追加のフィールド長
  106. $fr .= $name;
  107. // 「ファイルデータ」セグメント
  108. $fr .= $zdata;
  109. // 「データ記述子」セグメント (オプションですが、アーカイブがファイルとして提供されない場合は必須です)
  110. // ファイルとして機能します
  111. $fr .= Pack('V', $crc); // crc32
  112. $fr .= Pack('V', $c_len); // 圧縮ファイルサイズ
  113. $fr .= Pack('V', $unc_len); // 非圧縮ファイルサイズ
  114. // このエントリを配列に追加します
  115. $this ->データセック[] = $fr;
  116. $new_offset = strlen(implode('', $this->datasec));
  117. // 中央ディレクトリレコードに追加します
  118. $cdrec = "/x50/x4b/x01/x02";
  119. $cdrec .= "/x00/x00"; //
  120. によって作成されたバージョン $cdrec .= "/x14/x00"; //
  121. を抽出するために必要なバージョン $cdrec .= "/x00/x00"; // 生成目的ビットフラグ
  122. $cdrec .= "/x08/x00"; // 圧縮方式
  123. $cdrec .= $hexdtime; // 最終更新日時
  124. $cdrec .= Pack('V', $crc); // crc32
  125. $cdrec .= Pack('V', $c_len); // 圧縮ファイルサイズ
  126. $cdrec .= Pack('V', $unc_len); // 非圧縮ファイルサイズ
  127. $cdrec .= Pack('v', strlen($name) ); // ファイル名の長さ
  128. $cdrec .= Pack('v', 0 ); // 追加のフィールド長
  129. $cdrec .= Pack('v', 0 ); // ファイルコメントの長さ
  130. $cdrec .= Pack('v', 0 ); // ディスク番号の開始
  131. $cdrec .= Pack('v', 0 ); // 内部ファイル属性
  132. $cdrec .= Pack('V', 32 ); // 外部ファイル属性 - 'archive' ビット セット
  133. $cdrec .= Pack('V', $this -> old_offset ); // ローカルヘッダーの相対オフセット
  134. $this -> old_offset = $new_offset;
  135. $cdrec .= $name;
  136. // オプションの追加フィールド、ファイルのコメントがここに入ります
  137. // 中央ディレクトリに保存します
  138. $this -> ctrl_dir[] = $cdrec;
  139. }
  140. function filezip(){
  141. $data = implode('', $this -> datasec);
  142. $ctrldir = implode('', $this -> ctrl_dir);
  143. $data を返します。
  144. $ctrldir 。
  145. $this -> eof_ctrl_dir 。
  146. Pack('v', sizeof($this -> ctrl_dir)) 。 // 「このディスク上」のエントリの合計数
  147. Pack('v', sizeof($this -> ctrl_dir)) 。 // 全体のエントリの合計数
  148. Pack('V', strlen($ctrldir)) 。 // 中央ディレクトリのサイズ
  149. Pack('V', strlen($data)) 。 // 中央ディレクトリの先頭へのオフセット
  150. "/x00/x00"; // .zip ファイルのコメントの長さ
  151. }
  152. }
  153. ?>
  154. 他に一つの比较简单があります
  155. [php] view plaincopy
  156. class createzip
  157. {
  158. /* @圧縮されたzipファイルを作成します 将多文件压缩成一个zip文ファイルの関数
  159. * @$files 数组型 实例array("1.jpg","2.jpg");
  160. * @destination 目标文件の路径 例:"c:/androidyue.zip"
  161. * @$overwrite かどうかは上盖と目标文件と同じ文件
  162. * @Androidyue によって記録
  163. * @Blog:http://thinkblog.sinaapp. com
  164. */
  165. function create_zip($files = array(),$destination = '',$overwrite = false)
  166. {
  167. //如果zip文件已经存在并および设置は不重写返false
  168. if(file_exists($ destination) && !$overwrite) { return false; }
  169. $valid_files = array();
  170. //ファイルが渡された場合...
  171. //実際の有効なファイル名を取得します
  172. if(is_array($files)) {
  173. //各ファイルを循環します
  174. foreach($ files as $file) {
  175. //ファイルが存在することを確認します
  176. if(file_exists($file)) {
  177. $valid_files[] = $file; }
  178. }
  179. }
  180. //実際の有効なファイルが存在する場合
  181. if (count($valid_files))
  182. {
  183. // アーカイブを作成します
  184. $zip = new ZipArchive()
  185. // ファイルが既に存在する場合は上書きし、存在しない場合は作成します
  186. if($zip- >open( $destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {
  187. return false; }
  188. //圧縮ファイルにファイルを追加
  189. foreach($valid_files as $file) {
  190. $zip ->addFile($file,$file);
  191. }
  192. //ファイルを閉じる
  193. $zip->close();
  194. //ファイルが存在するかどうかを確認する
  195. return file_exists($destination);
  196. }
  197. else{
  198. //実際の有効なファイルがない場合は、 false を返します
  199. }
  200. }
  201. }
  202. /****
  203. //テスト関数
  204. $files=array('temp.php','test.php');
  205. create_zip($files, 'myzipfile.zip', true);*/
  206. ?> コードをコピーします
圧縮ファイル、php

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。