大概需求:

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

细节需求:当前订单号_年月日+时间.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生成压缩文件实例相关推荐

  1. svn增量打包部署_利用svn的补丁文件打包生成增量文件

    下面的代码是maven版本 1. 创建patch.txt增量文件 保存到 文件目录下 比如 E:\aa\patch.txt 2. 编写java代码 package utils; import java ...

  2. java流与文件——java生成解压缩文件(夹)

    [0]README 0.1) 本文描述转自 http://blog.csdn.net/chenssy/article/details/9622171 , 旨在理解 java流与文件--java生成解压 ...

  3. Ubuntu 20.04.2.0 LTS 下Geany 1.36的“编译文件”和“生成当前文件”两个按键不可用

    [问题描述] Ubuntu 20.04.2.0 LTS 下利用 sudo apt-get install geany 命令安装Geany 1.36后,利用Geany 1.36写C++语言程序后,会出现 ...

  4. [已解决]vscode环境 ros系统 msg文件不生成.h文件

    vscode环境 ros系统 msg文件不生成.h文件 的解决方法 问题描述 问题原因 解决方式 问题描述 在没有用vscode编译器之前,通过修改Cmakelist文件能够正常生成msg文件的 同名 ...

  5. 旋转狗头:Python如何读取STL文件,生成STL文件预览图(缩略图)之进化,动态旋转Gif图

    之前的文章<Python如何读取STL文件,生成STL文件预览图(缩略图)>实现了将STL文件读取加载.绘制保存为某个角度下2D的png图片,作为预览图(缩略图).但是3D转2D,预览就丢 ...

  6. Python:pyinstaller如何将一个项目的.py和相关资源文件打包生成.exe文件

    前言 写这篇博文真属于意外,因为小编不是以学术为目的的,而仅仅是以讨女朋友喜欢为目的,所以文中略有狗粮.撇开这些,相信大家找到为了找到一个可行方案已经寻寻觅觅良久,本文或许便是你的"真命天子 ...

  7. POI导出多个Excel文件,生成压缩文件

    众所周知,每个Excel文件最多可以存储255个sheet.当需要导出的sheet数超过255个时,比较好的办法是将多个Excel文件压缩成.zip文件再导出 步骤:1 将需要导出的表封装到listB ...

  8. 【Android 安全】DEX 加密 ( Java 工具开发 | 解压 apk 文件 | 加密生成 dex 文件 | 打包未签名 apk 文件 | 文件解压缩相关代码 )

    文章目录 一.解压 apk 文件 二.加密生成 dex 文件 三.打包未签名 apk 文件 四.完整代码示例 五.文件解压缩相关代码 六.执行结果 参考博客 : [Android 安全]DEX 加密 ...

  9. java导出excel文件_POI生成EXCEL文件

    一.背景 根据指定格式的JSON文件生成对应的excel文件,需求如下 支持多sheet 支持单元格合并 支持插入图片 支持单元格样式可定制 需要 标题(title),表头(head),数据(data ...

最新文章

  1. 缓冲区溢出漏洞攻击——Shellcode编写
  2. [渝粤教育] 中国地质大学 事故应急救援 复习题
  3. ifconfig源代码-NetBSD
  4. 【零基础学Java】—成员变量和局部变量(九)
  5. 揭露QPS增高后的秘密
  6. 词性标注-隐马尔可夫模型
  7. Flutter学习 — 实现滑动关闭、删除item
  8. There appears to be trouble with your network connection.Retrying
  9. Excel打造翻译神器(自定义函数)
  10. egg-views-ejs
  11. 字句解 (易經大意 韓長庚)
  12. 《流浪地球》反响强烈,车联网现状又该如何发展?
  13. 攻防世界-MISC之如来十三掌
  14. CTSCAPIO 2017游记
  15. 实验2:天气查询小程序
  16. GLAD:部分相干光模拟
  17. Db2数据库计算年龄
  18. 六大真实场景赛题,ECV2022极市计算机视觉开发者榜单大赛预报名开启
  19. 【设计模式之禅】模板方法模式
  20. 如何让大脑放松(学生必读)

热门文章

  1. 关于int类型除以1000后保留两位小数的问题,并且在excel里打印出来
  2. 从前M个字母中取N个的无重复排列(回溯)
  3. [Angularjs]国际化
  4. windows7修改双系统启动项名称、先后顺序、等待时间
  5. WHEREIS(1)
  6. 运维工程师必备之负载均衡集群及LVS详解
  7. Ontology与OO作为一种需求分析或软件构建方法的存在意义
  8. 基于 HTML5 WebGL 的 3D 智慧隧道漫游巡检
  9. 微软更新Azure SQL将可根据重要性工作进行重整顺序
  10. 沃尔玛正测试货架扫描机器人,并称不会取代人类员工