大概需求:

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

细节需求:当前订单号_年月日+时间.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这样才能使用这个类库。

程序下载地址:http://download.csdn.net/detail/venus150/8799855

欢迎加入PHP技术和职场交流群:383730534

PHP生成压缩文件开发实例的更多相关文章

  1. java生成压缩文件

    在工作过程中,需要将一个文件夹生成压缩文件,然后提供给用户下载.所以自己写了一个压缩文件的工具类.该工具类支持单个文件和文件夹压缩.放代码: import java.io.BufferedOutput ...

  2. ASP.NET生成压缩文件(rar打包)

    首先引用ICSharpCode.SharpZipLib.dll,没有在这里下载:http://files.cnblogs.com/files/cang12138/ICSharpCode.SharpZi ...

  3. Java生成压缩文件(zip、rar 格式)

    jar坐标: <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant</ar ...

  4. css javascript 自动化压缩(保存后即自动生成压缩文件)

    先上图:

  5. C#利用SharpZipLib解压或压缩文件夹实例操作

    最近要做一个项目涉及到C#中压缩与解压缩的问题的解决方法,大家分享. 这里主要解决文件夹包含文件夹的解压缩问题. )下载SharpZipLib.dll,在http://www.icsharpcode. ...

  6. php 3.2 生成压缩文件,并下载

    public function zip_download() { $array = array( 'http://local.qki.com/site_upload/erweima/20190826/ ...

  7. php 生成压缩文件

    $fileList = array( "site_upload/form_file_clause_extend/20180224/1519456901_1481718257.jpg" ...

  8. C#压缩文件 不压缩路径

    我想把 E:\\AA\BB\11.txt 压缩后存入 E:\\AA1\BB1\11.rar 但是当我解压( E:\\AA1\BB1\11.rar)的时候,发现:11.txt 不是在 E:\\AA1\B ...

  9. C#压缩文件为zip格式

    Vercher   C#压缩文件为zip格式 需要ICSharpCode.SharpZipLib.dll,网上下载的到. 代码是从网上找来的: 1 public class ZipClass 2 { ...

随机推荐

  1. ASC(1)G(上升时间最长的序列)

    G - Beautiful People Time Limit: 10000/5000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Other ...

  2. Linux下批量改动名字方法

    如果任务是把文件夹下全部的.log后缀文件名称中的2014去掉. 方法一) 脚本 这样的方法通过ls把当前文件夹下全部的文件进行遍历,然后获取文件名称,进行mv操作.例如以下: #!/bin/sh f ...

  3. C++类的定义之作用域

    每个类都定义了自己的新作用域和唯一的类型.在类的定义体内声明内成员,将成员名引入类的作用域.两个不同的类具有两个不同的类作用域. 例如: Class First { int memi; double  ...

  4. 数据库性能测试---前阿里数据库团队资深DBA杨奇龙

    杨奇龙 前阿里数据库团队资深DBA 主要负责淘宝业务线,经历多次11.11,有海量业务访问DB架构设计经验. 目前就职于有赞科技DBA,负责数据库运维工作,熟悉MySQL 性能优化,故障诊断,性能压测 ...

  5. 《RESTful Web Services》第四章 设计URI

    引言 URI是跨越Web的资源描述符,一个URI由以下内容组成——协议.主机.端口号.路径

  6. 实例源码--Android智能家居系统源码

      下载源码   技术要点:  1.Android应 用开发基础框架 2.SQLITE数据库的 使用 3.网络通信 4.GOOGLE地图模块 5.源码带有非常详 细的中文注释 ...... 详细介绍: ...

  7. com.service.impl

    package com.service.impl; import java.util.ArrayList; import java.util.LinkedHashMap; import java.ut ...

  8. php笔记02:整型细节说明

    1.php的一个整数可以是十进制,也可以是八进制和十六进制: 比如:$a=0123; //八进制 $a=0x1A; //十六进制 2.php的整数都是有符号的数(java也是只有有符号数) 3.在ph ...

  9. [转]div里table居中的问题 Div与body顶部间隙

    本文转自:http://www.cnblogs.com/jinhui/archive/2008/09/24/1297729.html 将div的text-align设为center,然后将table的 ...

  10. highcharts 24小时显示数据,显示00:00格式的数据

    Showing 24 hours on xAxis WITHOUT a date on 00:00 格式参考PHP手册中的: strftime