> 백엔드 개발 > PHP 튜토리얼 > 파일 세트를 zip으로 패키징하는 PHP 클래스

파일 세트를 zip으로 패키징하는 PHP 클래스

WBOY
풀어 주다: 2016-07-25 08:43:06
원래의
849명이 탐색했습니다.

이 PHP 클래스는 배열에 파일을 하나씩 추가하고 마지막으로 추가된 파일을 zip으로 패키징할 수 있습니다.

  1. /* $Id: zip.lib.php,v 1.1 2004/02/14 15:21:18 anoncvs_tusedb Exp $ */
  2. // vim: Expandtab sw= 4 ts=4 sts=4:
  3. /**
  4. * Zip 檔案建立類別。
  5. * 製作 zip 檔案。
  6. *
  7. * 最後修改與擴充功能者:
  8. *
  9. * Hasin Hayder
  10. * 首頁: www.hasinme .info
  11. * 電子郵件:countdraculla@gmail.com
  12. * IDE:PHP Designer 2005
  13. *
  14. *
  15. * 最初基於:
  16. *
  17. * http:// www.zend.com/codex.php?id=535&single=1
  18. * 作者:Eric Mueller
  19. *
  20. * http://www.zend.com/codex。 php?id=470&single=1
  21. * 由Denis125
  22. *
  23. * 來自Peter Listiak 的補丁最後修改
  24. * 壓縮檔案的日期和時間
  25. *
  26. * 官方ZIP 檔案格式:http://www.pkware.com/appnote.txt
  27. *
  28. * @access公開
  29. */
  30. class zipfile
  31. {
  32. /**
  33. * 儲存壓縮資料的陣列
  34. *
  35. * @public array $datasec
  36. */
  37. public $ datasec = array();
  38. /**
  39. * 中央目錄
  40. *
  41. * @public array $ctrl_dir
  42. */
  43. public $ctrl_dir = array();
  44. /**
  45. * 中央目錄記錄結束
  46. *
  47. * @public string $eof_ctrl_dir
  48. */
  49. public $ eof_ctrl_dir = "x50x4bx05x06x00x00x00x00";
  50. /**
  51. * 最後偏移位置
  52. *
  53. * @public integer $old_offset
  54. */
  55. public $old_offset = 0;
  56. $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
  57. if ($timearray['year'] $timearray['year'] = 1980;
  58. $timearray[' montimearray[' montimearray[' montimearray[' montimearray” '] = 1;
  59. $timearray['mday'] = 1;
  60. $timearray['小時'] = 0;
  61. $timearray['分鐘'] = 0;
  62. $timearray [ 'seconds'] = 0;
  63. } // 結束if
  64. return (($timearray['year'] - 1980) ($timearray['hours'] > 1);
  65. }// 'unix2DosTime()' 메서드 끝
  66. /**
  67. * 아카이브에 "파일" 추가
  68. *
  69. * @param 문자열 파일 내용
  70. * @param 문자열 아카이브에 있는 파일 이름(경로를 포함할 수 있음)
  71. * @param 정수 현재 타임스탬프
  72. *
  73. * @access public
  74. */
  75. 함수 addFile($data, $name, $time = 0)
  76. {
  77. $name = str_replace('\', '/', $name);
  78. $dtime = decex($this->unix2DosTime($time));
  79. $hexdtime = 'x ' . $dtime[6] . $dtime[7]
  80. . '엑스' . $dtime[4] . $dtime[5]
  81. . '엑스' . $dtime[2] . $dtime[3]
  82. . '엑스' . $dtime[0] . $dtime[1];
  83. eval('$hexdtime = "' . $hexdtime . '";');
  84. $fr = "x50x4bx03x04";
  85. $fr .= "x14x00" ; //
  86. 을 추출하는 데 필요한 버전 $fr .= "x00x00"; // 생성 목적 비트 플래그
  87. $fr .= "x08x00"; // 압축 방법
  88. $fr .= $hexdtime; // 마지막 수정 시간 및 날짜
  89. // "로컬 파일 헤더" 세그먼트
  90. $unc_len = strlen($data);
  91. $crc = crc32($data);
  92. $zdata = gzcompress($data);
  93. $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // crc 버그 수정
  94. $c_len = strlen($zdata);
  95. $fr .= pack('V', $crc); // crc32
  96. $fr .= pack('V', $c_len); // 압축된 파일 크기
  97. $fr .= pack('V', $unc_len); // 압축되지 않은 파일 크기
  98. $fr .= pack('v', strlen($name)); // 파일 이름 길이
  99. $fr .= pack('v', 0); // 추가 필드 길이
  100. $fr .= $name;
  101. // "파일 데이터" 세그먼트
  102. $fr .= $zdata;
  103. // "데이터 설명자" 세그먼트(선택 사항이지만 아카이브가
  104. // 파일로 제공되지 않는 경우 필요함)
  105. $fr .= pack('V', $crc); // crc32
  106. $fr .= pack('V', $c_len); // 압축된 파일 크기
  107. $fr .= pack('V', $unc_len); // 압축되지 않은 파일 크기
  108. // 이 항목을 배열에 추가
  109. $this -> datasec[] = $fr;
  110. // 이제 중앙 디렉터리 레코드에 추가
  111. $cdrec = "x50x4bx01x02";
  112. $cdrec .= "x00x00"; // 버전은
  113. $cdrec .= "x14x00"; // 추출에 필요한 버전
  114. $cdrec .= "x00x00"; // 생성 목적 비트 플래그
  115. $cdrec .= "x08x00"; // 압축 방법
  116. $cdrec .= $hexdtime; // 마지막 수정 시간 및 날짜
  117. $cdrec .= pack('V', $crc); // crc32
  118. $cdrec .= pack('V', $c_len); // 압축된 파일 크기
  119. $cdrec .= pack('V', $unc_len); // 압축되지 않은 파일 크기
  120. $cdrec .= pack('v', strlen($name) ); // 파일 이름 길이
  121. $cdrec .= pack('v', 0 ); // 추가 필드 길이
  122. $cdrec .= pack('v', 0 ); // 파일 주석 길이
  123. $cdrec .= pack('v', 0 ); // 디스크 번호 start
  124. $cdrec .= pack('v', 0 ); // 내부 파일 속성
  125. $cdrec .= pack('V', 32 ); // 외부 파일 속성 - '아카이브' 비트 세트
  126. $cdrec .= pack('V', $this -> old_offset ); // 로컬 헤더의 상대 오프셋
  127. $this -> old_offset = strlen($fr);
  128. $cdrec .= $name;
  129. // 선택적 추가 필드, 파일 주석이 여기에 표시됩니다.
  130. // 중앙 디렉터리에 저장
  131. $ 이 -> ctrl_dir[] = $cdrec;
  132. } // 'addFile()' 메서드 끝
  133. /**
  134. * 파일 덤프
  135. *
  136. * @return 압축된 파일 문자열
  137. *
  138. * @access public
  139. */
  140. 함수 file()
  141. {
  142. $data = implode('', $this -> datasec);
  143. $ctrldir = implode('', $this -> ctrl_dir);
  144. return
  145. $data .
  146. $ctrldir .
  147. $this -> eof_ctrl_dir .
  148. pack('v', sizeof($this -> ctrl_dir)) . // "이 디스크에 있는" 항목의 총 개수
  149. pack('v', sizeof($this -> ctrl_dir)) . // 전체 항목의 총 개수
  150. pack('V', strlen($ctrldir)) . // 중앙 dir
  151. 의 크기 pack('V', strlen($data)) . // 중앙 디렉토리의 시작 오프셋
  152. "x00x00"; // .zip 파일 주석 길이
  153. }// 'file()' 메서드 끝
  154. /**
  155. * 원본 addFile 함수의 래퍼
  156. *
  157. * 작성자: Hasin Hayder, 1월 29일 오전 1시 29분
  158. *
  159. * @param array 상대/절대 경로가 있는 파일 배열 Zip 파일로 추가
  160. *
  161. * @access public
  162. */
  163. 함수 addFiles($files /*배열만 전달*/)
  164. {
  165. foreach($files as $file)
  166. {
  167. if (is_file($file)) //디렉터리 확인
  168. {
  169. $data = implode("",file($file));
  170. $this->addFile($data,$file);
  171. }
  172. }
  173. }
  174. /**
  175. * 원본 파일의 래퍼 함수
  176. *
  177. * 작성자: Hasin Hayder, 1월 29일 오전 1시 29분
  178. *
  179. * @param string 출력 파일 이름
  180. *
  181. * @접속 공개
  182. */
  183. 함수 출력($ 파일)
  184. {
  185. $fp=fopen($file,"w");
  186. fwrite($fp,$this->file());
  187. fclose($fp);
  188. }
  189. } // 'zipfile' 클래스 끝
复代码

PHP, 우편


원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿