PHP生成压缩文件实例

前端之家收集整理的这篇文章主要介绍了PHP生成压缩文件实例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

大概需求:

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

细节需求:当前订单号_年月日+时间.zip 例如:

1.生成压缩文件,压缩文件名格式:

2.压缩文件存放在根目录 /upload/zipfile/年月/自定义的压缩文件名.zip

3.点击下载压缩包,系统开始对压缩文件打包,打包完成后自动开始下载

4.为了防止暴露压缩包文件路径,需要对下载的压缩包文件名改名

具体操作模式请见下面的代码

文件路径:

压缩包文件存放路径:/upload/zipfile/

上传的附件存放路径:/upload/file/

1.基本配置文件文件 config.inc.PHP放在系统根目录

<div class="jb51code">
<pre class="brush: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

/*

  • 生成压缩包文件名
  • @param [String] $orderNum 订单号
  • @return [String] 返回带有绝对路径的订单号的压缩文件名
    */

function get_zipname($orderNum) {
$zipName = SYSDOWNLOAD . '/' . 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;
}

/*

function dir_path($dirpath) {
$dirpath = str_replace('\',$dirpath);
if (substr($dirpath,-1) != '/')
$dirpath = $dirpath . '/';
return $dirpath;
}

/*

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相关文章