> 백엔드 개발 > PHP 튜토리얼 > PHP는 일련의 파일을 zip 패키지로 패키지합니다.

PHP는 일련의 파일을 zip 패키지로 패키지합니다.

WBOY
풀어 주다: 2016-07-25 08:56:20
원래의
871명이 탐색했습니다.
  1. /**
  2. * Zip 파일 생성 클래스.
  3. * zip 파일을 만듭니다.
  4. *
  5. * @access public
  6. */
  7. 클래스 zip 파일
  8. {
  9. /**
  10. * 압축된 데이터를 저장할 배열
  11. *
  12. * @public array $datasec
  13. */
  14. 공개 $datasec = array();
  15. /**
  16. * 중앙 디렉터리
  17. *
  18. * @public array $ctrl_dir
  19. */
  20. 공개 $ctrl_dir = array();
  21. /**
  22. * 중앙 디렉터리 기록 끝
  23. *
  24. * @public string $eof_ctrl_dir
  25. */
  26. 공개 $eof_ctrl_dir = "x50x4bx05x06x00x00x00x00";
  27. /**
  28. * 마지막 오프셋 위치
  29. *
  30. * @public 정수 $old_offset
  31. */
  32. 공개 $old_offset = 0;
  33. /**
  34. * Unix 타임스탬프를 4바이트 DOS 날짜 및 시간 형식으로 변환합니다(date
  35. *는 상위 2바이트, 시간은 규모 비교가 가능하도록 하위 2바이트).
  36. *
  37. * @param 정수 현재 Unix 타임스탬프
  38. *
  39. * @return 정수 4바이트 DOS 형식의 현재 날짜
  40. *
  41. * @access private
  42. * /
  43. function unix2DosTime($unixtime = 0) {
  44. $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
  45. if ($timearray['연도'] < 1980) {
  46. $timearray['연도'] = 1980;
  47. $timearray[' mon'] = 1;
  48. $timearray['mday'] = 1;
  49. $timearray['hours'] = 0;
  50. $timearray['분'] = 0;
  51. $timearray ['초'] = 0;
  52. } // 종료 if
  53. return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
  54. ($timearray['hours'] << 11) | ($timearray['분'] << 5) | ($timearray['초'] >> 1);
  55. }// 'unix2DosTime()' 메서드 끝
  56. /**
  57. * 아카이브에 "파일" 추가
  58. *
  59. * @param 문자열 파일 내용
  60. * @param 문자열 아카이브에 있는 파일 이름(경로를 포함할 수 있음)
  61. * @param 정수 현재 타임스탬프
  62. *
  63. * @access public
  64. */
  65. 함수 addFile($data, $name, $time = 0)
  66. {
  67. $name = str_replace('\', '/', $name);
  68. $dtime = decex($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" ; //
  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 ); // 외부 파일 속성 - '아카이브' 비트 세트
  116. $cdrec .= pack('V', $this -> old_offset ); // 로컬 헤더의 상대 오프셋
  117. $this -> old_offset = strlen($fr);
  118. $cdrec .= $name;
  119. // 선택적 추가 필드, 파일 주석이 여기에 표시됩니다.
  120. // 중앙 디렉터리에 저장
  121. $ 이 -> ctrl_dir[] = $cdrec;
  122. } // 'addFile()' 메서드 끝
  123. /**
  124. * 파일 덤프
  125. *
  126. * @return 압축된 파일 문자열
  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. * 작성자: Hasin Hayder, 1월 29일 오전 1시 29분
  148. *
  149. * @param array 상대/절대 경로가 있는 파일 배열 Zip 파일로 추가
  150. *
  151. * @access public
  152. */
  153. 함수 addFiles($files /*배열만 전달*/)
  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. * 작성자: Hasin Hayder, 1월 29일 오전 1시 29분
  168. *
  169. * @param string 출력 파일 이름
  170. *
  171. * @접속 공개
  172. */
  173. 함수 출력($ 파일)
  174. {
  175. $fp=fopen($file,"w");
  176. fwrite($fp,$this->file());
  177. fclose($fp);
  178. }
  179. } // 'zipfile' 클래스 끝
复代码


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