PHP实现将多个文件压缩成zip格式并下载到本地的方法示例


Posted in PHP onMay 23, 2018

本文实例讲述了PHP实现将多个文件压缩成zip格式并下载到本地的方法。分享给大家供大家参考,具体如下:

废话不多说,直接上代码

//这里需要注意该目录是否存在,并且有创建的权限
$zipname = 'path/test.zip'
//这是要打包的文件地址数组
$files = array("mypath/test1.txt","mypath/test2.pdf");
$zip = new ZipArchive();
$res = $zip->open($zipname, ZipArchive::CREATE);
if ($res === TRUE) {
 foreach ($files as $file) {
 //这里直接用原文件的名字进行打包,也可以直接命名,需要注意如果文件名字一样会导致后面文件覆盖前面的文件,所以建议重新命名
  $new_filename = substr($file, strrpos($file, '/') + 1);
  $zip->addFile($file, $new_filename);
 }
}
//关闭文件
$zip->close();
//这里是下载zip文件
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: Binary");
header("Content-Length: " . filesize($zipname));
header("Content-Disposition: attachment; filename=\"" . basename($zipname) . "\"");
readfile($zipname);
exit;

附:这里再为大家提供一个zip压缩类:

<?php
# 
# PHPZip v1.2 by Sext (sext@neud.net) 2002-11-18
#   (Changed: 2003-03-01)
# 
# Makes zip archive
#
# Based on "Zip file creation class", uses zLib
#
#
class PHPZip
{
  function Zip($dir, $zipfilename)
  {
    if (@function_exists('gzcompress'))
    {  
      $curdir = getcwd();
      if (is_array($dir)) 
      {
          $filelist = $dir;
      }
      else 
      {
        $filelist = $this -> GetFileList($dir);
      }
      if ((!empty($dir))&&(!is_array($dir))&&(file_exists($dir))) chdir($dir);
      else chdir($curdir);
      if (count($filelist)>0)
      {
        foreach($filelist as $filename)
        {
          if (is_file($filename))
          {
            $fd = fopen ($filename, "r");
            $content = fread ($fd, filesize ($filename));
            fclose ($fd);
            if (is_array($dir)) $filename = basename($filename);
            $this -> addFile($content, $filename);
          }
        }
        $out = $this -> file();
        chdir($curdir);
        $fp = fopen($zipfilename, "w");
        fwrite($fp, $out, strlen($out));
        fclose($fp);
      }
      return 1;
    } 
    else return 0;
  }
  function GetFileList($dir)
  {
    if (file_exists($dir))
    {
      $args = func_get_args();
      $pref = $args[1];
      $dh = opendir($dir);
      while($files = readdir($dh))
      {
        if (($files!=".")&&($files!="..")) 
        {
          if (is_dir($dir.$files)) 
          {
            $curdir = getcwd();
            chdir($dir.$files);
            $file = array_merge($file, $this -> GetFileList("", "$pref$files/"));
            chdir($curdir);
          }
          else $file[]=$pref.$files;
        }
      }
      closedir($dh);
    }
    return $file;
  }
  var $datasec   = array();
  var $ctrl_dir   = array();
  var $eof_ctrl_dir = "x50x4bx05x06x00x00x00x00";
  var $old_offset  = 0;
  /**
   * Converts an Unix timestamp to a four byte DOS date and time format (date
   * in high two bytes, time in low two bytes allowing magnitude comparison).
   *
   * @param integer the current Unix timestamp
   *
   * @return integer the current date in a four byte DOS format
   *
   * @access private
   */
  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);
  } // end of the 'unix2DosTime()' method
  /**
   * Adds "file" to archive
   *
   * @param string  file contents
   * @param string  name of the file in the archive (may contains the path)
   * @param integer the current timestamp
   *
   * @access public
   */
  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  = "x50x4bx03x04";
    $fr  .= "x14x00";      // ver needed to extract
    $fr  .= "x00x00";      // gen purpose bit flag
    $fr  .= "x08x00";      // 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 = "x50x4bx01x02";
    $cdrec .= "x00x00";        // version made by
    $cdrec .= "x14x00";        // version needed to extract
    $cdrec .= "x00x00";        // gen purpose bit flag
    $cdrec .= "x08x00";        // 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;
  } // end of the 'addFile()' method
  /**
   * Dumps out file
   *
   * @return string the zipped file
   *
   * @access public
   */
  function file()
  {
    $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
      "x00x00";               // .zip file comment length
  } // end of the 'file()' method
} // end of the 'PHPZip' class
?>

用法:

$zipfiles =array("/root/pooy/test1.txt","/root/pooy/test2.txt");
$z = new PHPZip();
//$randomstr = random(8);
$zipfile = TEMP."/photocome_".$groupid.".zip";
$z->Zip($zipfiles, $zipfile);

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
一个php导出oracle库的php代码
Apr 20 PHP
php mysql Errcode: 28 终极解决方法
Jul 01 PHP
PHP中基本符号及使用方法
Mar 23 PHP
PHP通过session id 实现session共享和登录验证的代码
Jun 03 PHP
基于PHP开发中的安全防范知识详解
Jun 06 PHP
jQuery中的RadioButton,input,CheckBox取值赋值实现代码
Feb 18 PHP
PHP.ini安全配置检测工具pcc简单介绍
Jul 02 PHP
PHP下SSL加密解密、验证、签名方法(很简单)
Jun 28 PHP
PHP函数超时处理方法
Feb 14 PHP
iOS+PHP注册登录系统 PHP部分(上)
Dec 26 PHP
php mysql PDO 查询操作的实例详解
Sep 23 PHP
PHP Post获取不到非表单数据的问题解决办法
Feb 27 PHP
PHP实现的mysql读写分离操作示例
May 22 #PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
May 21 #PHP
PHP+MariaDB数据库操作基本技巧备忘总结
May 21 #PHP
PhpStorm本地断点调试的方法步骤
May 21 #PHP
PHP自动识别当前使用移动终端
May 21 #PHP
PHP连接MySQL数据库并以json格式输出
May 21 #PHP
PHP 访问数据库配置通用方法(json)
May 20 #PHP
You might like
PHP安装攻略:常见问题解答(三)
2006/10/09 PHP
用缓存实现静态页面的测试
2006/12/06 PHP
Linux系统中设置多版本PHP共存配合Nginx服务器使用
2015/12/21 PHP
PHP Ajax JavaScript Json获取天气信息实现代码
2016/08/17 PHP
php命名空间设计思想、用法与缺点分析
2019/07/17 PHP
php求斐波那契数的两种实现方式【递归与递推】
2019/09/09 PHP
jQuery 选择器项目实例分析及实现代码
2012/12/28 Javascript
HTML长文本截取含有HTML代码同样适用的两种方法
2013/07/31 Javascript
浅谈javascript六种数据类型以及特殊注意点
2013/12/20 Javascript
Node.js中JavaScript操作MySQL的常用方法整理
2016/03/01 Javascript
有关easyui-layout中的收缩层无法显示标题的解决办法
2016/05/10 Javascript
全面理解JavaScript中的继承(必看)
2016/06/16 Javascript
AngularJS验证信息框架的封装插件用法【w5cValidator扩展插件】
2016/11/03 Javascript
vue-loader教程介绍
2017/06/14 Javascript
Vue学习笔记之表单输入控件绑定
2017/09/05 Javascript
Nuxt.js的路由跳转操作(页面跳转nuxt-link)
2020/11/06 Javascript
vue 图片裁剪上传组件的实现
2020/11/12 Javascript
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
2015/03/05 Python
状态机的概念和在Python下使用状态机的教程
2015/04/11 Python
python脚本设置超时机制系统时间的方法
2016/02/21 Python
python 获取图片分辨率的方法
2019/01/08 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
python多线程使用方法实例详解
2019/12/30 Python
浅谈Python3实现两个矩形的交并比(IoU)
2020/01/18 Python
解决tensorflow添加ptb库的问题
2020/02/10 Python
pycharm如何使用anaconda中的各种包(操作步骤)
2020/07/31 Python
python绘图模块之利用turtle画图
2021/02/12 Python
python中random模块详解
2021/03/01 Python
美国珠宝精品店:Opulent Jewelers
2019/08/20 全球购物
能源工程专业应届生求职信
2014/03/01 职场文书
法人委托书范本
2014/09/15 职场文书
村主任“四风”问题个人整改措施
2014/10/04 职场文书
2015年全国“爱牙日”宣传活动总结
2015/03/23 职场文书
2015年团支部工作总结
2015/04/03 职场文书
幼儿园开学报名通知
2015/07/16 职场文书
实习报告范文
2019/07/30 职场文书