>백엔드 개발 >PHP 튜토리얼 >PHP 압축 파일 도움말 클래스

PHP 압축 파일 도움말 클래스

WBOY
WBOY원래의
2016-07-25 08:45:341383검색
압축파일, php
  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 = 배열();
  9. var $ctrl_dir = 배열();
  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. $이것 -> addFile($fileValue, "$filename");
  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("콘텐츠 유형: 애플리케이션/옥텟-스트림");
  36. header("Content-disposition: attachment; filename=".$zipfilename);
  37. }
  38. echo $this -> 파일zip();
  39. }else{
  40. echo "zip 생성 오류!";
  41. }
  42. unlink($zipfilenametemp);
  43. }
  44. }
  45. //dir 트리 가져오기..
  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!="." and $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['연도'] < 1980) {
  72. $timearray['연도'] = 1980;
  73. $timearray['mon'] = 1;
  74. $timearray['mday'] = 1;
  75. $timearray['시간'] = 0;
  76. $timearray['분'] = 0;
  77. $timearray['초'] = 0;
  78. } //
  79. 이면 종료 return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
  80. ($timearray['hours'] << 11) | ($timearray['분'] << 5) | ($timearray['초'] >> 1);
  81. }
  82. function addFile($data, $name, $time = 0){
  83. $name = str_replace('//', '/', $name);
  84. $dtime = decex($this->unix2DosTime($time));
  85. $hexdtime = '/x' . $dtime[6] . $dtime[7]
  86. . '/x' . $dtime[4] . $dtime[5]
  87. . '/x' . $dtime[2] . $dtime[3]
  88. . '/x' . $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 ); // 외부 파일 속성 - '아카이브' 비트 세트
  133. $cdrec .= pack('V', $this -> old_offset ); // 로컬 헤더의 상대 오프셋
  134. $this -> old_offset = $new_offset;
  135. $cdrec .= $이름;
  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. $이것 -> 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] 일반 사본 보기
  156. 클래스 createzip
  157. {
  158. /* @압축된 zip 파일을 생성합니다.
  159. * @destination 目标文件的路径 如"c:/androidyue.zip"
  160. * @$overwrite 是否为覆盖与目标文件상동문件
  161. * @Recorded By Androidyue
  162. * @Blog: http://thinkblog.sinaapp.com
  163. */
  164. function create_zip($files = array(),$destination = '',$overwrite = false)
  165. {
  166. //如果zip文件已经存在并且设置为不返回false
  167. if(file_exists($destination) && !$overwrite) { return false; }
  168. $valid_files = array();
  169. //파일이 전달된 경우...
  170. //실제 유효한 파일 이름 가져오기
  171. if(is_array($files)) {
  172. //각 파일을 순환
  173. foreach($files as $file) {
  174. //파일이 존재하는지 확인
  175. if(file_exists($file)) {
  176. $valid_files[] = $file ;
  177. }
  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. //압축 파일에 파일 추가
  190. foreach($valid_files as $file) {
  191. $zip-> ;addFile($file,$file);
  192. }
  193. //파일 닫기
  194. $zip->close()
  195. //파일이 있는지 확인 exists
  196. return file_exists($destination );
  197. }
  198. else{
  199. //실제 유효한 파일이 없으면 false를 반환합니다.
  200. return false;
  201. }
  202. /* ***
  203. //테스트 함수
  204. $files=array('temp.php','test.php')
  205. create_zip($files, 'myzipfile.zip', true); ****/
  206. ?>
  207. 코드 복사

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.