PHP生成压缩文件实例


Posted in PHP onFebruary 07, 2015

大概需求:

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

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

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

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

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

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

 

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

文件路径:

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

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

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

 

define('SYS_ROOT', str_replace("\\", '/', 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 . '/' . date('Ym') . '/' . $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('\\', '/', $dirpath);
  if (substr($dirpath, -1) != '/')
    $dirpath = $dirpath . '/';
  return $dirpath;
}

/*
 * 生成文件目录
 * @param [String] $path 文件路径
 * @return [String] 返回生成的文件目录结构
 */

function dir_create($path) {
  if (is_dir($path))
    return true;
  $dir = str_replace(SYS_DOWNLOAD . '/', '', $path);
  $dir = dir_path($dir);
  $temp = explode('/', $dir);
  $cur_dir = SYS_DOWNLOAD . '/';
  $max = count($temp) - 1;
  for ($i = 0; $i < $max; $i++) {
    $cur_dir .= $temp[$i] . '/';
    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 . '/' . $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这样才能使用这个类库。

PHP 相关文章推荐
Php获取金书网的书名的实现代码
Jun 11 PHP
Server.HTMLEncode让代码在页面里显示为源代码
Dec 08 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
Aug 23 PHP
PHP实现AES256加密算法实例
Sep 22 PHP
php图片上传类 附调用方法
May 15 PHP
php版微信小店API二次开发及使用示例
Nov 12 PHP
PHP数据库操作二:memcache用法分析
Aug 16 PHP
利用PHPStorm如何开发Laravel应用详解
Aug 30 PHP
浅谈PHP中如何实现Hook机制
Nov 14 PHP
PHP的mysqli_stat()函数讲解
Jan 23 PHP
Laravel5.7框架安装与使用学习笔记图文详解
Apr 02 PHP
PHP fopen中文文件名乱码问题解决方案
Oct 28 PHP
PHP实现股票趋势图和柱形图
Feb 07 #PHP
PHP中的闭包(匿名函数)浅析
Feb 07 #PHP
PHP实现自动识别Restful API的返回内容类型
Feb 07 #PHP
PHP curl CURLOPT_RETURNTRANSFER参数的作用使用实例
Feb 07 #PHP
迁移PHP版本到PHP7
Feb 06 #PHP
php include类文件超时问题处理
Feb 06 #PHP
PHP的cURL库简介及使用示例
Feb 06 #PHP
You might like
用PHP与XML联手进行网站编程代码实例
2008/07/10 PHP
ThinkPHP3.2.3数据库设置新特性
2015/03/05 PHP
THINKPHP在添加数据的时候获取主键id的值方法
2017/04/03 PHP
javascript 时间比较实现代码
2009/10/28 Javascript
css配合jquery美化 select
2013/11/29 Javascript
JavaScript动态修改弹出窗口大小的方法
2015/04/06 Javascript
JQuery中Ajax()的data参数类型实例分析
2015/12/15 Javascript
如何实现json数据可视化详解
2016/11/24 Javascript
基于twbsPagination.js分页插件使用心得(分享)
2017/10/21 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
JS使用对象的defineProperty进行变量监控操作示例
2019/02/02 Javascript
JavaScript实现多张图片放大镜效果示例【不限定图片尺寸,rem单位】
2019/05/14 Javascript
[46:20]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第二场 1月22日
2021/03/11 DOTA
python数据结构之二叉树的建立实例
2014/04/29 Python
Python入门_浅谈逻辑判断与运算符
2017/05/16 Python
Python操作MongoDB详解及实例
2017/05/18 Python
PyCharm鼠标右键不显示Run unittest的解决方法
2018/11/30 Python
python开启debug模式的方法
2019/06/27 Python
django 快速启动数据库客户端程序的方法示例
2019/08/16 Python
使用OpenCV实现仿射变换—旋转功能
2019/08/29 Python
python图的深度优先和广度优先算法实例分析
2019/10/26 Python
python调用c++返回带成员指针的类指针实例
2019/12/12 Python
使用Python将Exception异常错误堆栈信息写入日志文件
2020/04/08 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
法国房车租赁网站:Yescapa
2019/08/26 全球购物
波兰化妆品和护肤品购物网站:eKobieca
2019/08/30 全球购物
大学生自荐信
2013/12/11 职场文书
医学求职信
2014/05/28 职场文书
婚前协议书标准版
2014/10/19 职场文书
2014年爱国卫生工作总结
2014/11/22 职场文书
2015年物资管理工作总结
2015/05/20 职场文书
篮球拉拉队口号
2015/12/25 职场文书
Vue Element UI自定义描述列表组件
2021/05/18 Vue.js
PHP设计模式(观察者模式)
2021/07/07 PHP
CSS三大特性继承性、层叠性和优先级详解
2022/01/18 HTML / CSS
通过T-SQL语句创建游标与实现数据库加解密功能
2022/03/16 SQL Server