dirTree($dir,$dir); } $zipfilenametemp = time().">
当前位置:Gxlcms > PHP教程 > php压缩文件帮助类

php压缩文件帮助类

时间:2021-07-01 10:21:17 帮助过:26人阅读

  1. /*
  2. File name: /include/zip.php
  3. Author: 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, filesize ($filename));
  21. fclose ($fd);
  22. if (is_array($dir)) $filename = basename($dir);
  23. $this -> addFile($fileValue, "$filename");
  24. }else{
  25. $this->dirTree($dir,$dir);
  26. }
  27. $zipfilenametemp = time().$zipfilename;
  28. $out = $this -> filezip();
  29. $fp = fopen($zipfilenametemp, "w");
  30. fwrite($fp, $out, strlen($out));
  31. fclose($fp);
  32. $filesize = 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 -> filezip();
  39. }else{
  40. echo "create zip error!";
  41. }
  42. unlink($zipfilenametemp);
  43. }
  44. }
  45. //get dir tree..
  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") and $file!="." and $file!=".."){
  52. $dirInfo[0]++;
  53. $rootDir ="$fileDir$file/";
  54. $this -> addFile('', "$rootDir");
  55. //go on n's folders
  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. $this -> 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['year'] < 1980) {
  72. $timearray['year'] = 1980;
  73. $timearray['mon'] = 1;
  74. $timearray['mday'] = 1;
  75. $timearray['hours'] = 0;
  76. $timearray['minutes'] = 0;
  77. $timearray['seconds'] = 0;
  78. } // end if
  79. return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
  80. ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
  81. }
  82. function addFile($data, $name, $time = 0){
  83. $name = str_replace('//', '/', $name);
  84. $dtime = dechex($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"; // ver needed to extract
  92. $fr .= "/x00/x00"; // gen purpose bit flag
  93. $fr .= "/x08/x00"; // compression method
  94. $fr .= $hexdtime; // last mod time and date
  95. // "local file header" segment
  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); // fix crc bug
  101. $fr .= pack('V', $crc); // crc32
  102. $fr .= pack('V', $c_len); // compressed filesize
  103. $fr .= pack('V', $unc_len); // uncompressed filesize
  104. $fr .= pack('v', strlen($name)); // length of filename
  105. $fr .= pack('v', 0); // extra field length
  106. $fr .= $name;
  107. // "file data" segment
  108. $fr .= $zdata;
  109. // "data descriptor" segment (optional but necessary if archive is not
  110. // served as file)
  111. $fr .= pack('V', $crc); // crc32
  112. $fr .= pack('V', $c_len); // compressed filesize
  113. $fr .= pack('V', $unc_len); // uncompressed filesize
  114. // add this entry to array
  115. $this -> datasec[] = $fr;
  116. $new_offset = strlen(implode('', $this->datasec));
  117. // now add to central directory record
  118. $cdrec = "/x50/x4b/x01/x02";
  119. $cdrec .= "/x00/x00"; // version made by
  120. $cdrec .= "/x14/x00"; // version needed to extract
  121. $cdrec .= "/x00/x00"; // gen purpose bit flag
  122. $cdrec .= "/x08/x00"; // compression method
  123. $cdrec .= $hexdtime; // last mod time & date
  124. $cdrec .= pack('V', $crc); // crc32
  125. $cdrec .= pack('V', $c_len); // compressed filesize
  126. $cdrec .= pack('V', $unc_len); // uncompressed filesize
  127. $cdrec .= pack('v', strlen($name) ); // length of filename
  128. $cdrec .= pack('v', 0 ); // extra field length
  129. $cdrec .= pack('v', 0 ); // file comment length
  130. $cdrec .= pack('v', 0 ); // disk number start
  131. $cdrec .= pack('v', 0 ); // internal file attributes
  132. $cdrec .= pack('V', 32 ); // external file attributes - 'archive' bit set
  133. $cdrec .= pack('V', $this -> old_offset ); // relative offset of local header
  134. $this -> old_offset = $new_offset;
  135. $cdrec .= $name;
  136. // optional extra field, file comment goes here
  137. // save to central directory
  138. $this -> ctrl_dir[] = $cdrec;
  139. }
  140. function filezip(){
  141. $data = implode('', $this -> datasec);
  142. $ctrldir = implode('', $this -> ctrl_dir);
  143. return
  144. $data .
  145. $ctrldir .
  146. $this -> eof_ctrl_dir .
  147. pack('v', sizeof($this -> ctrl_dir)) . // total # of entries "on this disk"
  148. pack('v', sizeof($this -> ctrl_dir)) . // total # of entries overall
  149. pack('V', strlen($ctrldir)) . // size of central dir
  150. pack('V', strlen($data)) . // offset to start of central dir
  151. "/x00/x00"; // .zip file comment length
  152. }
  153. }
  154. ?>
  155. 还有另外一个比较简单的
  156. [php] view plaincopy
  157. class createzip
  158. {
  159. /* @creates a compressed zip file 将多个文件压缩成一个zip文件的函数
  160. * @$files 数组类型 实例array("1.jpg","2.jpg");
  161. * @destination 目标文件的路径 如"c:/androidyue.zip"
  162. * @$overwrite 是否为覆盖与目标文件相同的文件
  163. * @Recorded By Androidyue
  164. * @Blog:http://thinkblog.sinaapp.com
  165. */
  166. function create_zip($files = array(),$destination = '',$overwrite = false)
  167. {
  168. //如果zip文件已经存在并且设置为不重写返回false
  169. if(file_exists($destination) && !$overwrite) { return false; }
  170. $valid_files = array();
  171. //if files were passed in...
  172. //获取到真实有效的文件名
  173. if(is_array($files)) {
  174. //cycle through each file
  175. foreach($files as $file) {
  176. //make sure the file exists
  177. if(file_exists($file)) {
  178. $valid_files[] = $file;
  179. }
  180. }
  181. }
  182. //如果存在真实有效的文件
  183. if(count($valid_files))
  184. {
  185. //create the archive
  186. $zip = new ZipArchive();
  187. //打开文件 如果文件已经存在则覆盖,如果没有则创建
  188. if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {
  189. return false;
  190. }
  191. //向压缩文件中添加文件
  192. foreach($valid_files as $file) {
  193. $zip->addFile($file,$file);
  194. }
  195. //关闭文件
  196. $zip->close();
  197. //检测文件是否存在
  198. return file_exists($destination);
  199. }
  200. else{
  201. //如果没有真实有效的文件返回false
  202. return false;
  203. }
  204. }
  205. }
  206. /****
  207. //测试函数
  208. $files=array('temp.php','test.php');
  209. create_zip($files, 'myzipfile.zip', true);
  210. ****/
  211. ?>

压缩文件, php

人气教程排行