侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

PHP生成压缩文件实例

php  /  管理员 发布于 7年前   143

大概需求:

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

细节需求:当前订单号_年月日+时间.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; ");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 gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码
  • PHP 图片水印类代码
  • php文字水印和php图片水印实现代码(二种加水印方法)
  • PHP实现图片压缩的两则实例
  • php实现压缩多个CSS与JS文件的方法
  • PHP图片处理之使用imagecopy函数添加图片水印实例
  • php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
  • php文件压缩之PHPZip类用法实例
  • php使用gzip压缩传输js和css文件的方法
  • php图片水印添加,压缩,剪切的封装类实现


  • 上一条:
    PHP处理大量表单字段的便捷方法
    下一条:
    PHP实现股票趋势图和柱形图
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客