• 技术文章 >后端开发 >php教程

    PHP生成压缩文件实例_PHP

    2016-05-31 13:17:25原创367
    大概需求:

    每一个订单都有多个文件附件,在下载的时候希望对当前订单的文件自动打包成一个压缩包下载

    细节需求:当前订单号_年月日+时间.zip 例如:

    1.生成压缩文件,压缩文件名格式:

    2.压缩文件存放在根目录 /upload/zipfile/年月/自定义的压缩文件名.zip

    3.点击下载压缩包,系统开始对压缩文件打包,打包完成后自动开始下载

    4.为了防止暴露压缩包文件路径,需要对下载的压缩包文件名改名

    具体操作模式请见下面的代码:

    文件路径:

    压缩包文件存放路径:/upload/zipfile/

    上传的附件存放路径:/upload/file/

    1.基本配置文件文件 config.inc.php放在系统根目录

    define('SYS_ROOT', str_replace("\\", '//m.sbmmt.com/m/', dirname(__FILE__)));
    define('SYS_UPLOAD', SYS_ROOT.'/upload/file');
    define('SYS_DOWNLOAD', SYS_ROOT.'/upload/zipfile');
    define('SYS_WIN', strpos(strtoupper(PHP_OS), 'WIN') !== false ? true: false);
    define('SYS_CHMOD', ('0777' && !SYS_WIN) ? '0777' : 0);
    

    2.压缩包程序代码文件 getzip.php

    header("Content-type: text/html; charset=utf-8");
    require_once '../config.inc.php'; //载入配置路径配置文件
    $arrfiles = array(SYS_UPLOAD . '/1.jpg',
      SYS_UPLOAD . '/x.jpg',); //这里是附件的文件数组
    $orderNum = '888'; //订单号
    $downFileName = 'tieniu.zip'; //下载的文件名 如果为空那么就是系统自定义名称 如果指定就显示指定名字
    $zipUrl = create_zip($arrfiles, $orderNum); //生成的压缩文件名词
    file_down($zipUrl, $downFileName); //提供http下载,并可以进行重命名下载文件,建议重命名,防止路径猜解
    
    /*
     * 生成压缩包文件名
     * @param [String] $orderNum 订单号
     * @return [String] 返回带有绝对路径的订单号的压缩文件名
     */
    
    function get_zipname($orderNum) {
      $zipName = SYS_DOWNLOAD . '//m.sbmmt.com/m/' . date('Ym') . '//m.sbmmt.com/m/' . $orderNum . '_' . date("Ymd_Hi") . '.zip';
      return $zipName;
    }
    
    /*
     * 按照特定需求打包压缩包的目录结构设置
     */
    
    function pack_object() {
      
    }
    
    /*
     * 生成压缩包
     * @param [Array] $arrfiles 带有绝对路径的文件数组
     * @param [String] $orderNum 订单号
     * @return [String] 返回带有绝对路径的订单号的压缩文件名 如如果失败返回 FALSE
     */
    
    function create_zip($arrfiles, $orderNum) {
      $zipName = get_zipname($orderNum); //获得文件名
      dir_create(dirname($zipName)); //建立生成压缩文件的目录
      $zip = new ZipArchive();
      if ($zip->open($zipName, ZIPARCHIVE::CREATE) !== TRUE) {
        return FALSE;
      }
      foreach ($arrfiles as $path) {
        if (is_file($path)) {//判断文件是否存在
          $zip->addFile($path, basename($path)); //把文件加入到压缩包中
        }
      }
      $zip->close();
      return $zipName;
    }
    
    /*
     * 处理文件目录
     * @param [Array] $arrfiles 带有绝对路径的文件数组
     * @param [String] $dirpath 文件路径
     * @return [String] 返回处理的文件路径,方便生成文件目录
     */
    
    function dir_path($dirpath) {
      $dirpath = str_replace('\\', '//m.sbmmt.com/m/', $dirpath);
      if (substr($dirpath, -1) != '//m.sbmmt.com/m/')
        $dirpath = $dirpath . '//m.sbmmt.com/m/';
      return $dirpath;
    }
    
    /*
     * 生成文件目录
     * @param [String] $path 文件路径
     * @return [String] 返回生成的文件目录结构
     */
    
    function dir_create($path) {
      if (is_dir($path))
        return true;
      $dir = str_replace(SYS_DOWNLOAD . '//m.sbmmt.com/m/', '', $path);
      $dir = dir_path($dir);
      $temp = explode('//m.sbmmt.com/m/', $dir);
      $cur_dir = SYS_DOWNLOAD . '//m.sbmmt.com/m/';
      $max = count($temp) - 1;
      for ($i = 0; $i < $max; $i++) {
        $cur_dir .= $temp[$i] . '//m.sbmmt.com/m/';
        if (is_dir($cur_dir))
          continue;
        @mkdir($cur_dir);
        if (SYS_CHMOD)
          @chmod($cur_dir, SYS_CHMOD);
        if (!is_file($cur_dir . '/index.html') && !is_file($cur_dir . '/index.php'))
          file_copy(SYS_ROOT . '/upload/index.html', $cur_dir . '/index.html');
      }
    
      return is_dir($path);
    }
    
    /*
     * 文件COPY
     * @param [String] $from copy源文件
     * @param [String] $to copy文件目的地
     * @return [Bool] 成功 ture 失败 false
     */
    
    function file_copy($from, $to) {
      dir_create(dirname($to));
      if (is_file($to) && SYS_CHMOD)
        @chmod($to, SYS_CHMOD);
      if (@copy($from, $to)) {
        if (SYS_CHMOD)
          @chmod($to, SYS_CHMOD);
        return true;
      } else {
        return false;
      }
    }
    
    /*
     * 文件下载处理函数
     * @param [String] $file 文件路径
     * @param [String] $filename 下载时间重新命名的文件名
     * @param [String] $data 下载文件填装的数据内容
     */
    
    function file_down($file, $filename = '', $data = '') {
      if (!$data && !is_file($file))
        exit;
      $filename = $filename ? $filename : basename($file);
      $filetype = file_ext($filename);
      $filesize = $data ? strlen($data) : filesize($file);
      ob_end_clean();
      @set_time_limit(0);
      if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) {
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
      } else {
        header('Pragma: no-cache');
      }
      header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT');
      header('Content-Encoding: none');
      header('Content-Length: ' . $filesize);
      header('Content-Disposition: attachment; filename=' . $filename);
      header('Content-Type: ' . $filetype);
      if ($data) {
        echo $data;
      } else {
        readfile($file);
      }
      exit;
    }
    
    function file_ext($filename) {
      return strtolower(trim(substr(strrchr($filename, '.'), 1)));
    }
    
    //此函数未用到,用来做整个目录的打包下载
    function listdir($start_dir = '.') {
      $files = array();
      if (is_dir($start_dir)) {
        $fh = opendir($start_dir);
        while (($file = readdir($fh)) !== false) {
          if (strcmp($file, '.') == 0 || strcmp($file, '..') == 0)
            continue;
          $filepath = $start_dir . '//m.sbmmt.com/m/' . $file;
          if (is_dir($filepath))
            $files = array_merge($files, listdir($filepath));
          else
            array_push($files, $filepath);
        }
        closedir($fh);
      } else {
        $files = false;
      }
      return $files;
    }
    
    

    3.PHP程序生成压缩文件需要用到压缩类:ZipArchive

    这个是php的扩展类,自php5.2版本以后就已经支持这个扩展,如果你在使用的时候出现错误,查看下php.ini里面的extension=php_zip.dll前面的分号有没有去掉,然后再重启Apache这样才能使用这个类库。

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:PHP 生成压缩文件
    上一篇:PHP四舍五入、取整、round函数使用示例_PHP 下一篇:PHP函数extension_loaded()用法实例_PHP
    PHP编程就业班

    相关文章推荐

    • 面试官:列举几种PHP拓展的实现手段及其性能比较?• GD输出汉字的函数的分析_PHP• javascript - 哪里有可以下载的股票历史数据?• Yii rules常用规则示例_php实例• 日常整理PHP中简单的图形处理(经典)_php实例

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网