php 增加压缩文件,PHP生成压缩文件实例

大概需求:

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值