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这样才能使用这个类库。

时间: 2024-10-15 11:03:31

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

生成压缩文件

files:是所有文件的目录destZip:是生成压缩文件所存放的目录 public static void zipFiles(Collection<String> files,String destZip){ FileOutputStream fout=null; ZipOutputStream zout=null; int len=-1; byte[] buf=new byte[1024]; try{ FileInputStream fin=null; fout=new FileOutpu

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

jar坐标: <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant</artifactId> <version>1.10.5</version> </dependency> 话不多说,直接上代码 package com.demo.student.util; import org.apache.tools.zip.ZipEntry; impo

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

最近要做一个项目涉及到C#中压缩与解压缩的问题的解决方法,大家分享. 这里主要解决文件夹包含文件夹的解压缩问题. )下载SharpZipLib.dll,在http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx中有最新免费版本,“Assemblies for .NET 1.1, .NET 2.0, .NET CF 1.0, .NET CF 2.0: Download [297 KB] ”点击Download可以下载,解压后里边

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

public function zip_download() { $array = array( 'http://local.qki.com/site_upload/erweima/20190826/1566809174292_100063_865373044010119.png', 'http://local.qki.com/site_upload/erweima/20190826/1566809222969_100064_865373044013253.png' ); $tmpFile =

使用插件压缩文件并提供下载

直接上网上拿来的方法: /// <summary> /// 功能:压缩文件(暂时只压缩文件夹下一级目录中的文件,文件夹及其子级被忽略) /// </summary> /// <param name="dirPath">被压缩的文件夹夹路径</param> /// <param name="zipFilePath">生成压缩文件的路径,为空则默认与被压缩文件夹同一级目录,名称为:文件夹名+.zip</p

C#压缩文件夹坑~

dotNet疯狂之路No.29  今天很残酷,明天更残酷,后天很美好,但是绝大部分人是死在明天晚上,只有那些真正的英雄才能见到后天的太阳.  We're here to put a dent in the universe. Otherwise why else even be here?   开始从网上找了个压缩的示例  我去坑的不要不要的 没办法重新找 都是复制来复制去 没啥意思 前提:ICSharpCode.SharpZipLib.dll引用 创建一个类 public class ZipC

如何对压缩文件设置解压密码

通常,压缩文件只需要解压就可以解压成功,但有个解压密码的设置功能今天才知道怎么搞. 简单说下操作: 首先选中你要压缩的文件,单击鼠标的右键,会有选项"添加到压缩文件",之前我一直直接选择"添加到"...rar"",结果直接生成压缩文件,这点要注意. 之后会有参数对话框出现,这时就可以设置密码了.

POI以SAX方式解析Excel2007大文件(包含空单元格的处理) Java生成CSV文件实例详解

http://blog.csdn.net/l081307114/article/details/46009015 http://www.cnblogs.com/dreammyle/p/5458280.html . Office2007与Office Open XML 在Office 2007之前,Office一直都是以二进制位的方式存储,但这种格式不易被其它软件拿来使用,在各界的压力下,MicroSoft于2005年发布了基于XML的ooxml开放文档标准.ooxml的xml schema强调减

测试:tar压缩打包会不会将期间新生成的文件打包进去

作为一个运维,越来越像一个开发了:简单的难的,全用脚本实现了,不写java却写起了shell,瞬间感觉自己帅(衰)帅(衰)的: 公司下达的任务:将一个740+G的文件夹备份到另一个服务器:看着挺简单,scp啥的早晚能搞定,无非是时间的事儿:好,下面来说说环境: 这个文件夹是个项目,里面会不停的生成录音文件(mp3和wav格式):2.系统的总共容量为1T,其中录音文件已经占用了740G了:3.要求传输过去之前生成一个文件的文本,传输过去之后再生成一个文本:两个文本对比:可以知道是否能对上号(这个人