将文件夹压缩成zip文件的php代码

  1.请先下载我准备好的zip.php工具类,下载后解压,将里面的文件放入对应的目录中,我是放在虚拟目录下的include文件夹中。

  2.在你的php文件中加入下面代码即可

  

复制代码 代码如下:

  require_once "./include/zip.php";

  $zip = new PHPZip();

  //$zip -> createZip("要压缩的文件夹目录地址", "压缩后的文件名.zip");   //只生成不自动下载

  $zip -> downloadZip("要压缩的文件夹目录地址", "压缩后的文件名.zip");  //自动下载

  实例:可以参考下面的伪代码来看一个具体的使用场景:

  代码

  

复制代码 代码如下:

  require_once "./include/zip.php";

  if (!$download) {

  exit();

  }

  set_time_limit(60);

  $tmpManager = new TmpManager(); //假设我们有一个类来完成后面的操作

  $tempfolder = array();

  $tempfile = array();

  //假设我们是通过在页面上选择checkbox来下载已选的文件夹或文件,并一同打包

  for($i = 0;$i < $checkboxnum;$i++) {

  $value = ${"select".$i};

  if ($value != '') {

  $this_type = substr($value, 0, 1);

  $this_id = substr($value, 1);

  //将文件夹和文件的情况分开处理

  if ($this_type == 'd') {

  $tempfolder[] = $this_id;

  }

  elseif ($this_type == 'f') {

  $tempfile[] = $this_id;

  }

  }

  }

  @mkdir($tempdir);

  $curtempdir = "$tempdir/".$userid; //不同用户在不同的临时文件夹下操作

  if (file_exists($curtempdir)) {

  $tmpManager->DeleteDir($curtempdir); //删除旧的文件夹

  }

  if (sizeof($tempfolder) > 0 || sizeof($tempfile) > 0) {

  mkdir($curtempdir, 0777); //如果有要打包的文件货文件夹,重新创建文件夹

  }

  if (sizeof($tempfile) > 0) {

  $tmpManager->CopyFile($tempfile,$curtempdir); //将要下载的文件copy到创建的文件夹

  }

  if (sizeof($tempfolder) > 0) {

  $tmpManager->CopyFolder($tempfolder,$curtempdir); //将要下载的文件夹copy到创建的文件夹

  }

  $zip = new PHPZip();

  $zip -> downloadZip($curtempdir, "file_".date('Ymd').".zip"); //打包并下载

  zip.php

  

复制代码 代码如下:

  <?php

  /*

  File name: /include/zip.php

  Author:    Horace 2009/04/15

  */

  class PHPZip{

  var $dirInfo = array("0","0");

  var $rootDir = '';

  var $datasec = array();

  var $ctrl_dir = array();

  var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";

  var $old_offset = 0;

  function downloadZip(){

  createZip($dir, $zipfilename, true);

  }

  function createZip($dir, $zipfilename, $autoDownload = false){

  if (@function_exists('gzcompress')){

  @set_time_limit("0");

  if (is_array($dir)){

  $fd = fopen ($dir, "r");

  $fileValue = fread ($fd, filesize ($filename));

  fclose ($fd);

  if (is_array($dir)) $filename = basename($dir);

  $this -> addFile($fileValue, "$filename");

  }else{

  $this->dirTree($dir,$dir);

  }

  $zipfilenametemp = time().$zipfilename;

  $out = $this -> filezip();

  $fp = fopen($zipfilenametemp, "w");

  fwrite($fp, $out, strlen($out));

  fclose($fp);

  $filesize = filesize($zipfilenametemp);

  if ($filesize < 104857600) {

  if($autoDownload){

  header("Content-type: application/octet-stream");

  header("Content-disposition: attachment; filename=".$zipfilename);

  }

  echo $this -> filezip();

  }else{

  echo "create zip error!";

  }

  unlink($zipfilenametemp);

  }

  }

  //get dir tree..

  function dirTree($directory,$rootDir){

  global $_SERVER,$dirInfo,$rootDir;

  $fileDir=$rootDir;

  $myDir=dir($directory);

  while($file=$myDir->read()){

  if(is_dir("$directory/$file") and $file!="." and $file!=".."){

  $dirInfo[0]++;

  $rootDir ="$fileDir$file/";

  $this -> addFile('', "$rootDir");

  //go on n's folders

  $this->dirTree("$directory/$file",$rootDir);

  }else{

  if($file!="." and $file!=".."){

  $dirInfo[1]++;

  //$fd = fopen ("$directory/$file", "r");

  $fileValue = file_get_contents("$directory/$file");

  //fclose ($fd);

  $this -> addFile($fileValue, "$fileDir$file");

  }

  }

  }

  $myDir->close();

  }

  function unix2DosTime($unixtime = 0) {

  $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);

  if ($timearray['year'] < 1980) {

  $timearray['year'] = 1980;

  $timearray['mon'] = 1;

  $timearray['mday'] = 1;

  $timearray['hours'] = 0;

  $timearray['minutes'] = 0;

  $timearray['seconds'] = 0;

  } // end if

  return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |

  ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);

  }

  function addFile($data, $name, $time = 0){

  $name = str_replace('\\', '/', $name);

  $dtime = dechex($this->unix2DosTime($time));

  $hexdtime = '\x' . $dtime[6] . $dtime[7]

  . '\x' . $dtime[4] . $dtime[5]

  . '\x' . $dtime[2] . $dtime[3]

  . '\x' . $dtime[0] . $dtime[1];

  eval('$hexdtime = "' . $hexdtime . '";');

  $fr = "\x50\x4b\x03\x04";

  $fr .= "\x14\x00"; // ver needed to extract

  $fr .= "\x00\x00"; // gen purpose bit flag

  $fr .= "\x08\x00"; // compression method

  $fr .= $hexdtime; // last mod time and date

  // "local file header" segment

  $unc_len = strlen($data);

  $crc = crc32($data);

  $zdata = gzcompress($data);

  $c_len = strlen($zdata);

  $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug

  $fr .= pack('V', $crc); // crc32

  $fr .= pack('V', $c_len); // compressed filesize

  $fr .= pack('V', $unc_len); // uncompressed filesize

  $fr .= pack('v', strlen($name)); // length of filename

  $fr .= pack('v', 0); // extra field length

  $fr .= $name;

  // "file data" segment

  $fr .= $zdata;

  // "data descriptor" segment (optional but necessary if archive is not

  // served as file)

  $fr .= pack('V', $crc); // crc32

  $fr .= pack('V', $c_len); // compressed filesize

  $fr .= pack('V', $unc_len); // uncompressed filesize

  // add this entry to array

  $this -> datasec[] = $fr;

  $new_offset = strlen(implode('', $this->datasec));

  // now add to central directory record

  $cdrec = "\x50\x4b\x01\x02";

  $cdrec .= "\x00\x00"; // version made by

  $cdrec .= "\x14\x00"; // version needed to extract

  $cdrec .= "\x00\x00"; // gen purpose bit flag

  $cdrec .= "\x08\x00"; // compression method

  $cdrec .= $hexdtime; // last mod time & date

  $cdrec .= pack('V', $crc); // crc32

  $cdrec .= pack('V', $c_len); // compressed filesize

  $cdrec .= pack('V', $unc_len); // uncompressed filesize

  $cdrec .= pack('v', strlen($name) ); // length of filename

  $cdrec .= pack('v', 0 ); // extra field length

  $cdrec .= pack('v', 0 ); // file comment length

  $cdrec .= pack('v', 0 ); // disk number start

  $cdrec .= pack('v', 0 ); // internal file attributes

  $cdrec .= pack('V', 32 ); // external file attributes - 'archive' bit set

  $cdrec .= pack('V', $this -> old_offset ); // relative offset of local header

  $this -> old_offset = $new_offset;

  $cdrec .= $name;

  // optional extra field, file comment goes here

  // save to central directory

  $this -> ctrl_dir[] = $cdrec;

  }

  function filezip(){

  $data = implode('', $this -> datasec);

  $ctrldir = implode('', $this -> ctrl_dir);

  return

  $data .

  $ctrldir .

  $this -> eof_ctrl_dir .

  pack('v', sizeof($this -> ctrl_dir)) . // total # of entries "on this disk"

  pack('v', sizeof($this -> ctrl_dir)) . // total # of entries overall

  pack('V', strlen($ctrldir)) . // size of central dir

  pack('V', strlen($data)) . // offset to start of central dir

  "\x00\x00"; // .zip file comment length

  }

  }

  ?>

  zip.php文件打包