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 相关文章推荐
手把手教你使用DedeCms V3的在线采集图文教程
Apr 03 PHP
PHP var_dump遍历对象属性的函数与应用代码
Jun 04 PHP
php运行出现Call to undefined function curl_init()的解决方法
Nov 02 PHP
php生成静态文件的多种方法分享
Jul 17 PHP
php读取mysql中文数据出现乱码的解决方法
Aug 16 PHP
php多功能图片处理类分享(php图片缩放类)
Mar 14 PHP
php 购物车完整实现代码
Jun 05 PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
Jun 20 PHP
PHP实现文件下载断点续传详解
Oct 15 PHP
php中magic_quotes_gpc对unserialize的影响分析
Dec 16 PHP
PDO操作MySQL的基础教程(推荐)
Aug 18 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
Apr 05 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+javascript的日历控件
2009/11/19 PHP
解析zend Framework如何自动加载类
2013/06/28 PHP
PHP内存使用情况如何获取
2015/10/10 PHP
php上传excel表格并获取数据
2017/04/27 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
2020/02/11 PHP
checkbox使用示例
2013/08/23 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
2014/06/19 Javascript
js中style.display=&quot;&quot;无效的解决方法
2014/10/30 Javascript
js格式化时间小结
2014/11/03 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
2016/01/03 Javascript
jQuery实现图片局部放大镜效果
2016/03/17 Javascript
javascript检查某个元素在数组中的索引值
2016/03/30 Javascript
深入学习nodejs中的async模块的使用方法
2017/07/12 NodeJs
View.post() 不靠谱的地方你知道多少
2017/08/29 Javascript
详解React Native开源时间日期选择器组件(react-native-datetime)
2017/09/13 Javascript
OpenLayer学习之自定义测量控件
2020/09/28 Javascript
JavaScript实现随机点名小程序
2020/10/29 Javascript
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
Saltstack快速入门简单汇总
2016/03/01 Python
Python的Flask框架中的Jinja2模板引擎学习教程
2016/06/30 Python
老生常谈python函数参数的区别(必看篇)
2017/05/29 Python
python脚本替换指定行实现步骤
2017/07/11 Python
python实现飞机大战游戏
2020/10/26 Python
python中的句柄操作的方法示例
2019/06/20 Python
如何使用Python 打印各种三角形
2019/06/28 Python
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
爱尔兰橄榄球店:Irish Rugby Store
2019/12/05 全球购物
介绍一下SQL Server里面的索引视图
2016/07/31 面试题
广州一家公司的.NET面试题
2016/06/11 面试题
酒店人事专员岗位职责
2013/12/19 职场文书
五水共治捐款倡议书
2014/05/14 职场文书
幼儿园三八妇女节活动总结
2015/02/06 职场文书
2016新春团拜会致辞
2015/08/01 职场文书