ホームページ  >  記事  >  バックエンド開発  >  PHP は、一連のファイルを zip パッケージにパッケージ化します。

PHP は、一連のファイルを zip パッケージにパッケージ化します。

WBOY
WBOYオリジナル
2016-07-25 08:56:20860ブラウズ
  1. /**
  2. * ZIPファイル作成クラス
  3. * ZIPファイルを作成します。
  4. *
  5. * @access public
  6. */
  7. class zipfile
  8. {
  9. /**
  10. * 圧縮データを格納する配列
  11. *
  12. * @public array $datasec
  13. */
  14. public $datasec = array();
  15. /**
  16. * 中央ディレクトリ
  17. *
  18. * @public array $ctrl_dir
  19. * /
  20. public $ctrl_dir = array();
  21. /**
  22. * 中央ディレクトリレコードの終わり
  23. *
  24. * @public string $eof_ctrl_dir
  25. */
  26. public $eof_ctrl_dir = "x50x4bx05x06x00x00x00x00";
  27. /**
  28. * 最終オフセット位置
  29. *
  30. * @public integer $old_offset
  31. */
  32. public $old_offset = 0;
  33. / **
  34. * Unix タイムスタンプを 4 バイトの DOS 日付と時刻形式に変換します (日付
  35. * 上位 2 バイト、時刻を下位 2 バイトで大小比較が可能)。
  36. *
  37. * @param integer 現在の Unix タイムスタンプ
  38. *
  39. * @現在の日付を整数で 4 バイトの DOS 形式で返します
  40. *
  41. * @access private
  42. */
  43. function unix2DosTime($unixtime = 0) {
  44. $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
  45. if ($timearray['year'] < 1980) {
  46. $timearray['year'] = 1980;
  47. $timearray['mon'] = 1;
  48. $ timearray['mday'] = 1;
  49. $timearray['hours'] = 0;
  50. $timearray['分'] = 0;
  51. $timearray['秒'] = 0;
  52. } // end if
  53. return (($timearray['年'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
  54. ($timearray['hours'] << 11) | ($timearray['分'] << 5) | ($timearray['秒'] >> 1);
  55. }// 'unix2DosTime()' メソッドの終わり
  56. /**
  57. * アーカイブに「ファイル」を追加します
  58. *
  59. * @param string ファイルの内容
  60. * @param アーカイブ内のファイルの文字列名 (パスが含まれる場合があります)
  61. * @param integer 現在のタイムスタンプ
  62. *
  63. * @access public
  64. */
  65. function addFile($data, $name, $time = 0)
  66. {
  67. $name = str_replace('\', ' /', $name);
  68. $dtime = dechex($this->unix2DosTime($time));
  69. $hexdtime = 'x' 。 $dtime[6] 。 $dtime[7]
  70. . 'バツ' 。 $dtime[4] 。 $dtime[5]
  71. . 'バツ' 。 $dtime[2] 。 $dtime[3]
  72. . 'バツ' 。 $dtime[0] 。 $dtime[1];
  73. eval('$hexdtime = "' . $hexdtime . '";');
  74. $fr = "x50x4bx03x04";
  75. $fr .= "x14x00"; // 抽出するにはverが必要です
  76. $fr .= "x00x00"; // 生成目的ビットフラグ
  77. $fr .= "x08x00"; // 圧縮方法
  78. $fr .= $hexdtime; // 最終更新日時
  79. // 「ローカル ファイル ヘッダー」セグメント
  80. $unc_len = strlen($data);
  81. $crc = crc32($data);
  82. $zdata = gzcompress($data);
  83. $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // crc バグを修正します
  84. $c_len = strlen($zdata);
  85. $fr .= Pack('V', $crc); // crc32
  86. $fr .= Pack('V', $c_len); // 圧縮ファイルサイズ
  87. $fr .= Pack('V', $unc_len); // 非圧縮ファイルサイズ
  88. $fr .= Pack('v', strlen($name)); // ファイル名の長さ
  89. $fr .= Pack('v', 0); // 余分なフィールド長
  90. $fr .= $name;
  91. // "ファイルデータ" セグメント
  92. $fr .= $zdata;
  93. // "データ記述子" セグメント (オプションですが、アーカイブではない場合は必須です
  94. //ファイルとして機能します)
  95. $fr .= Pack('V', $crc); // crc32
  96. $fr .= Pack('V', $c_len); // 圧縮ファイルサイズ
  97. $fr .= Pack('V', $unc_len); // 非圧縮ファイルサイズ
  98. // このエントリを配列に追加します
  99. $this -> datasec[] = $fr;
  100. // 中央ディレクトリにレコードを追加します
  101. $cdrec = "x50x4bx01x02";
  102. $cdrec .= "x00x00"; //
  103. が作成したバージョン $cdrec .= "x14x00"; // 抽出に必要なバージョン
  104. $cdrec .= "x00x00"; // 生成目的ビットフラグ
  105. $cdrec .= "x08x00"; // 圧縮方法
  106. $cdrec .= $hexdtime; // 最終更新日時
  107. $cdrec .= Pack('V', $crc); // crc32
  108. $cdrec .= Pack('V', $c_len); // 圧縮ファイルサイズ
  109. $cdrec .= Pack('V', $unc_len); // 非圧縮ファイルサイズ
  110. $cdrec .= Pack('v', strlen($name) ); // ファイル名の長さ
  111. $cdrec .= Pack('v', 0 ); // 余分なフィールド長
  112. $cdrec .= Pack('v', 0 ); // ファイルコメントの長さ
  113. $cdrec .= Pack('v', 0 ); // ディスク番号 start
  114. $cdrec .= Pack('v', 0 ); // 内部ファイル属性
  115. $cdrec .= Pack('V', 32 ); // 外部ファイル属性 - 'archive' ビット セット
  116. $cdrec .= Pack('V', $this -> old_offset ); // ローカルヘッダーの相対オフセット
  117. $this -> old_offset += strlen($fr);
  118. $cdrec .= $name;
  119. // オプションの追加フィールド、ファイルコメントがここに入ります
  120. // 中央ディレクトリに保存します
  121. $this -> ctrl_dir[] = $cdrec;
  122. } // 'addFile()' メソッドの終わり
  123. /**
  124. * ファイルをダンプします
  125. *
  126. * @return string 圧縮ファイル
  127. *
  128. * @access public
  129. */
  130. 関数 file()
  131. {
  132. $data = implode('', $this - > datasec);
  133. $ctrldir = implode('', $this -> ctrl_dir);
  134. return
  135. $data .
  136. $ctrldir .
  137. $this -> eof_ctrl_dir .
  138. Pack('v', sizeof($this -> ctrl_dir)) 。 // 「このディスク上」のエントリの合計数
  139. Pack('v', sizeof($this -> ctrl_dir)) 。 // 全体のエントリの合計数
  140. Pack('V', strlen($ctrldir)) 。 // 中央の dir
  141. Pack('V', strlen($data)) のサイズ。 // 中央ディレクトリの先頭へのオフセット
  142. "x00x00"; // .zip ファイルのコメントの長さ
  143. }// 'file()' メソッドの終わり
  144. /**
  145. * オリジナルの addFile 関数のラッパー
  146. *
  147. * 1 月 29 日、午前 1 時 29 分に Hasin Hayder によって作成されました
  148. *
  149. * @param array Zip ファイルに追加される相対/絶対パスを持つファイルの配列
  150. *
  151. * @アクセス公開
  152. */
  153. function addFiles($files /*Only Pass Array*/)
  154. {
  155. foreach($files as $file)
  156. {
  157. if (is_file($file)) //ディレクトリチェック
  158. {
  159. $data = implode("",file($file));
  160. $this->addFile($data,$file);
  161. }
  162. }
  163. }
  164. /**
  165. * オリジナルファイル関数のラッパー
  166. *
  167. * 1月29日午前1時29分にHasin Hayderによって作成されました
  168. *
  169. * @param string 出力ファイル名
  170. *
  171. * @access public
  172. */
  173. 関数出力($file)
  174. {
  175. $fp=fopen($file,"w");
  176. fwrite($fp,$this->file());
  177. fclose($fp);
  178. }
  179. } // 'zipfile' クラスの終わり
复制代码


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