`

php压缩zip文件(多级目录,自定义目录名)

    博客分类:
  • php
 
阅读更多

利用php的ZipArchive可以对文件进行打包,我这里包装了一个函数,传入数组,即可打包,数组的定义方式为:对于数组的每一个元素,当元素为数组时,键名为目录,否则就是将所有的字符串当做相对路径,将文件添加到压缩包的当前路径下,代码贴出来,附件中有可运行版本。

这里要再提一下的是,如果传入比如$list = array('file1' => './1.txt', 'file2' => './2.txt');这里的file1,file2作为键名毫无意义,并不会为之创建目录,因为值是一个字符串,所以压缩包的根目录里包含了1.txt, 2.txt,如果要将1.txt放入file1目录,2.txt放入file2目录,那么应该写参数为:

$list = array('list1' => array('./1.txt', './2.txt')),之所以这样方式实现,是因为考虑问题简单多了,只要值是数组,就创建目录,只要值不是数字,就必须是字符串,那么就直接添加文件到压缩包的当前路径下。当前路径则随着目录的创建逐层递归。

 

<?php
$wwwDIR = $_SERVER['DOCUMENT_ROOT'];
$datalist = array(
	'testzip' => array(
		"./1.txt",
		'tmp' => array(
			"./2.txt",
			"./3.txt",
		),
	),
);
$filename = zipArrayFiles($datalist, $wwwDIR);
if ($filename) {
	header("Cache-Control: public");
	header("Content-Description: File Transfer");
	header('Content-disposition: attachment; filename=' . basename($filename)); //文件名
	header("Content-Type: application/zip"); //zip格式的
	header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件
	header('Content-Length: ' . filesize($filename)); //告诉浏览器,文件大小
	@readfile($filename);
}
function zipArrayFiles($datalist, $outDir) {
	function _zipArrayFiles($datalist, $zip, $basePath = '') {
		foreach ($datalist as $dirname => $path) {
			if (!is_array($path)) {
				$zipPathName = $basePath ? $basePath . '/' . basename($path) : basename($path);
				$result = $zip->addFile($path, $zipPathName);
				if (false === $result) {
					return false;
				}
			} else {
				$zipDirName = $basePath ? $basePath . '/' . $dirname : $dirname;
				$result = $zip->addEmptyDir($zipDirName);
				if (false === $result) {
					return false;
				}
				$result = _zipArrayFiles($path, $zip, $zipDirName);
				if (false === $result) {
					return false;
				}
			}
		}
		return true;
	}
	$md5sum = md5(serialize($datalist));
	$filename = $outDir . '/' . $md5sum . '.zip';
	if (file_exists($filename)) {
		return $filename;
	}
	$zip = new ZipArchive;
	if ($zip->open($filename, ZIPARCHIVE::CREATE) !== TRUE) {
		return false;
	}
	$result = _zipArrayFiles($datalist, $zip);
	if (false === $result) {
		$zip->unchangeAll();
		return false;
	}
	$zip->close();
	return $filename;
}

 

 

分享到:
评论

相关推荐

    PHP生成压缩文,不带要压缩文件的根目录

    "PHP生成压缩文,不带要压缩文件的根目录"这个话题,主要涉及的是如何使用PHP的ZipArchive类来创建一个ZIP文件,但不包含源文件的根目录路径。下面将详细介绍这一知识点及其相关技术。 首先,我们需要了解PHP的Zip...

    JAVA解压ZIP多层目录文件(需ant.jar

    ### JAVA解压ZIP多层目录文件(需ant.jar) #### 概述 本文将详细介绍一个Java方法,该方法用于解压包含多层目录结构的ZIP文件,并能够支持中文文件名。这种方法利用了Apache Ant库中的`org.apache.tools.zip....

    压缩成zip文件和解压缩zip文件的VB程序.rar

    这个类提供了静态方法,如`CreateFromDirectory`用于将整个目录压缩到ZIP文件,`ExtractToDirectory`用于从ZIP文件中提取所有内容到指定目录。 2. **ZipArchive类**: - 如果需要更精细的控制,可以使用`System.IO...

    C++ Zlib库实现zip文件压缩解压(支持递归压缩)

    实现zip文件的压缩,我们通常会遍历要压缩的目录,递归地将每个文件添加到`zip`档案中。这需要使用`minizip`的`zipOpen`、`zipOpenNewFileInZip`、`zipWriteInFileInZip`和`zipCloseFileInZip`等函数。同时,对于每...

    vbs压缩和解压zip,vbs压缩zip,vbs解压zip

    3. **ZIP 文件格式**:一种广泛使用的文件压缩与存档格式,能够将多个文件及目录压缩成一个单一的ZIP文件,同时支持文件的加密保护。 #### 二、压缩 ZIP 文件 ##### 代码解析 ```vbscript Sub Zip(ByVal ...

    java 操作Zip文件(压缩、解压、加密).zip

    Java操作Zip文件主要涉及到对文件和目录的压缩与解压缩,以及在必要时对压缩文件进行加密处理。这里我们重点讨论使用两个库:`zip4j`和`Apache Ant`来实现这些功能。 1. **zip4j库**:`zip4j-1.3.2.jar`是一个用...

    PHP在线解、压缩ZIP文件程序 V1.0

    【PHP在线解、压缩ZIP文件程序 V1.0】是一个基于PHP开发的实用工具,它允许用户通过Web界面实现ZIP文件的在线解压和压缩。这个程序为网站管理员提供了便捷的方式来处理用户上传的ZIP文件,无需下载到本地,直接在...

    Java实现将多目录多层级文件打成ZIP包,以及解压ZIP包

    本文将详细讲解如何使用Java实现将多目录多层级的文件打成ZIP包,以及如何解压这些ZIP包。我们将主要关注`FileUtils.java`这个类,以及依赖的`commons-compress-1.1.jar`库。 `commons-compress-1.1.jar`是Apache ...

    UE引擎解压缩zip格式文件插件

    在处理资源管理时,有时需要将大量素材打包成压缩文件,如ZIP格式,以便于存储和传输。"UE引擎解压缩zip格式文件插件"就是为了应对这种需求而设计的工具。 这个插件主要针对UE4和UE5引擎,允许开发者在游戏中直接...

    在线解压、压缩ZIP文件程序 V1.0

    本程序能把站点中的 ZIP 压缩文件解压到指定目录。 转载请注明:本程序由 纯粹空间(http://www.softpure.com) 提供,作者:faisun(faisun@sina.com). 使用方法:把zip文件通过FTP上传到本文件相同的目录下,选择zip...

    php在线解压压缩zip工具

    本文将详述如何使用PHP实现在线解压和压缩ZIP文件的功能,以及与之相关的技术点。 首先,我们要理解PHP处理ZIP文件的核心库是`ZipArchive`。这个类提供了创建、读取、修改和提取ZIP文件的能力。在`myunzip.php`和`...

    多用户多级目录文件系统.zip

    本课程设计要求设计一个模拟的多用户多级目录的文件系统。通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。 二、课程设计的要求与数据 1. 在...

    c# 解压缩ZIP文件

    在.NET框架中,C#程序员可以使用不同的库来处理压缩文件,如ZIP格式。本教程主要聚焦于如何使用C#语言解压缩ZIP文件,重点在于介绍`ICSharpCode.SharpZipLib`库的使用方法。`ICSharpCode.SharpZipLib`是一个开源库,...

    C#用Ionic.Zip实现文件、目录的压缩及分卷

    iTextSharp实现PDF的合并与分卷 参见:https://download.csdn.net/download/xjzdr/85519979 C#用Ionic.Zip实现文件、目录的压缩及分卷

    VC++ MFC 如何用 CZip CUnzip类压缩解压缩文件

    3. **提取文件:** 使用`Extract`函数可以将ZIP中的文件提取到指定的目录。例如`myUnzip.Extract("target_path_in_zip\\source_file.txt", "destination_folder\\source_file.txt");`。 4. **获取ZIP信息:** 可以...

    zip文件压缩解压源码 (c++)

    `zip`文件格式是一种广泛使用的文件压缩标准,它允许将多个文件和目录打包成一个单一的文件,同时进行压缩,以节省存储空间。`unzip`则是对应的过程,将zip文件还原为原始的文件和目录结构。 在C++中实现zip文件的...

    Qt实现压缩和解压缩操作工程文件

    ZIP是一种广泛使用的档案格式,用于存储多个文件和目录到一个单一的文件中,通常用于减小文件大小以节省存储空间或提高传输速度。它包含了文件的压缩算法,如Deflate,以及元数据如文件名、时间戳和权限信息。 在Qt...

    swift-UnzipKit一个用于压缩和解压缩ZIP文件的Objective-Czlib封装

    2. **压缩文件和目录**:可以将单个文件或整个目录压缩成ZIP格式,方便存储和传输。 3. **进度反馈**:在进行压缩和解压缩操作时,UnzipKit提供了进度回调,允许开发者显示进度条或者更新状态信息,提升用户体验。 4...

    C语言实现Zip压缩解压.rar

    ZIP是一种广泛使用的文件压缩格式,它能够将多个文件打包并压缩成一个单一的ZIP档案,以便于存储、传输和分享。ZIP文件格式的标准由PKWARE公司制定,并由Info-ZIP组织进行开源实现。在C语言中实现ZIP操作,我们需要...

Global site tag (gtag.js) - Google Analytics