Zip 函数

警告

自 PHP 8.0.0 起,过程式 API 已弃用。应改用 ZipArchive

目录

添加注释

用户贡献的注释 20 个注释

14
nielsvandenberge at hotmail dot com
17 年前
这是我用来解压缩文件的函数。
它包含以下选项
* 在您喜欢的任何目录中解压缩
* 在 zip 文件的目录中解压缩
* 在 zip 文件目录中包含 zip 文件名称的目录中解压缩。(例如:C:\test.zip 将解压缩到 C:\test\ 中)
* 覆盖现有文件或不覆盖
* 它使用 Create_dirs($path) 函数创建不存在的目录

您应该使用带有斜杠 (/) 的绝对路径,而不是反斜杠 (\)。
我在使用加载了 php_zip.dll 扩展的 PHP 5.2.0 时对其进行了测试

<?php
/**
* 将源文件解压缩到目标目录
*
* @param string ZIP 文件的路径。
* @param string 解压缩 ZIP 文件的目标路径,如果为 false,则使用 ZIP 文件的目录
* @param boolean 指示是否将文件解压缩到以 ZIP 文件名命名的目录中(true)还是不(false)(仅当目标目录设置为 false 时!)。
* @param boolean 覆盖现有文件(true)还是不(false)
*
* @return boolean 成功或失败
*/
function unzip($src_file, $dest_dir=false, $create_zip_name_dir=true, $overwrite=true)
{
if (
$zip = zip_open($src_file))
{
if (
$zip)
{
$splitter = ($create_zip_name_dir === true) ? "." : "/";
if (
$dest_dir === false) $dest_dir = substr($src_file, 0, strrpos($src_file, $splitter))."/";

// 如果目标目录不存在,则创建目标目录的目录
create_dirs($dest_dir);

// 对于 ZIP 包中的每个文件
while ($zip_entry = zip_read($zip))
{
// 现在,我们将在目标目录中创建目录

// 如果文件不在根目录中
$pos_last_slash = strrpos(zip_entry_name($zip_entry), "/");
if (
$pos_last_slash !== false)
{
// 创建保存 ZIP 条目的目录(末尾带有“/”)
create_dirs($dest_dir.substr(zip_entry_name($zip_entry), 0, $pos_last_slash+1));
}

// 打开条目
if (zip_entry_open($zip,$zip_entry,"r"))
{

// 要保存在磁盘上的文件的名称
$file_name = $dest_dir.zip_entry_name($zip_entry);

// 检查是否应该覆盖文件
if ($overwrite === true || $overwrite === false && !is_file($file_name))
{
// 获取 ZIP 条目的内容
$fstream = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));

file_put_contents($file_name, $fstream );
// 设置权限
chmod($file_name, 0777);
echo
"save: ".$file_name."<br />";
}

// 关闭条目
zip_entry_close($zip_entry);
}
}
// 关闭 ZIP 文件
zip_close($zip);
}
}
else
{
return
false;
}

return
true;
}

/**
* 此函数创建递归目录(如果它不存在)
*
* @param String 要创建的路径
*
* @return void
*/
function create_dirs($path)
{
if (!
is_dir($path))
{
$directory_path = "";
$directories = explode("/",$path);
array_pop($directories);

foreach(
$directories as $directory)
{
$directory_path .= $directory."/";
if (!
is_dir($directory_path))
{
mkdir($directory_path);
chmod($directory_path, 0777);
}
}
}
}

// 将 C:/zipfiletest/zip-file.zip 解压缩到 C:/zipfiletest/zip-file/ 并覆盖现有文件
unzip("C:/zipfiletest/zip-file.zip", false, true, true);

// 将 C:/zipfiletest/zip-file.zip 解压缩到 C:/another_map/zipfiletest/ 并且不覆盖现有文件。注意:它不会创建以 ZIP 文件名命名的映射!
unzip("C:/zipfiletest/zip-file.zip", "C:/another_map/zipfiletest/", true, false);

?>
5
yarms at mail dot ru
14 年前
用于解压缩具有文件夹结构的文件的函数的极短版本
<?php

function unzip($file){

$zip=zip_open(realpath(".")."/".$file);
if(!
$zip) {return("无法处理文件 '{$file}'");}

$e='';

while(
$zip_entry=zip_read($zip)) {
$zdir=dirname(zip_entry_name($zip_entry));
$zname=zip_entry_name($zip_entry);

if(!
zip_entry_open($zip,$zip_entry,"r")) {$e.="无法处理文件 '{$zname}'";continue;}
if(!
is_dir($zdir)) mkdirr($zdir,0777);

#print "{$zdir} | {$zname} \n";

$zip_fs=zip_entry_filesize($zip_entry);
if(empty(
$zip_fs)) continue;

$zz=zip_entry_read($zip_entry,$zip_fs);

$z=fopen($zname,"w");
fwrite($z,$zz);
fclose($z);
zip_entry_close($zip_entry);

}
zip_close($zip);

return(
$e);
}

function
mkdirr($pn,$mode=null) {

if(
is_dir($pn)||empty($pn)) return true;
$pn=str_replace(array('/', ''),DIRECTORY_SEPARATOR,$pn);

if(
is_file($pn)) {trigger_error('mkdirr() 文件已存在', E_USER_WARNING);return false;}

$next_pathname=substr($pn,0,strrpos($pn,DIRECTORY_SEPARATOR));
if(
mkdirr($next_pathname,$mode)) {if(!file_exists($pn)) {return mkdir($pn,$mode);} }
return
false;
}

unzip("test.zip");

?>

祝您今天愉快! :)
2
nheimann at gmx dot net
16 年前
使用此扩展,您可以使用 ZipArchive 对象添加包含文件的目录。

<?php
/**
* FlxZipArchive,扩展 ZipArchiv。
* 添加包含文件和子目录的目录。
*
* <code>
* $archive = new FlxZipArchive;
* // .....
* $archive->addDir( 'test/blub', 'blub' );
* </code>
*/
class FlxZipArchive extends ZipArchive {
/**
* 将包含文件和子目录的目录添加到存档中
*
* @param string $location 真实位置
* @param string $name 存档中的名称
* @author Nicolas Heimann
* @access private
**/

public function addDir($location, $name) {
$this->addEmptyDir($name);

$this->addDirDo($location, $name);
// } // EO addDir;

/**
* 将文件和目录添加到存档中。
*
* @param string $location 真实位置
* @param string $name 存档中的名称
* @author Nicolas Heimann
* @access private
**/

private function addDirDo($location, $name) {
$name .= '/';
$location .= '/';

// 读取目录中的所有文件
$dir = opendir ($location);
while (
$file = readdir($dir))
{
if (
$file == '.' || $file == '..') continue;

// 递归,如果是目录:FlxZipArchive::addDir(),否则 ::File();
$do = (filetype() == 'dir') ? 'addDir' : 'addFile';
$this->$do($location . $file, $name . $file);
}
}
// EO addDirDo();
}
?>
1
Anonymous
19 年前
如果您(像我一样)只想将一个大字符串(例如,一个序列化数组或类似的东西)存储在 MySQL BLOB 字段中,请记住 MySQL 有一对 COMPRESS() 和 UNCOMPRESS() 函数可以完全做到这一点。因此,即使从 Java 等其他语言访问数据库,压缩/解压缩也是可用的。
1
wdtemp at seznam dot cz
14 年前
您好,
如果您只有 ZIP 文件的原始内容,它是一个字符串,并且您无法在服务器上创建文件(因为存在安全模式),从而无法创建可以传递给 zip_open() 的文件,那么您将很难获得 ZIP 数据的解压缩内容。
这可能会有所帮助
我编写了一个简单的 ZIP 解压缩函数,用于从存储在字符串中的存档中解压缩第一个文件(无论它是什么文件)。它只是解析第一个文件条目中的本地文件头,获取该文件的原始压缩数据,然后解压缩该数据(通常,ZIP 文件中的数据使用“DEFLATE”方法压缩,因此我们将使用 gzinflate() 函数解压缩它)。

<?php
function decompress_first_file_from_zip($ZIPContentStr){
// 输入:ZIP 存档 - 整个 ZIP 存档的内容作为一个字符串
// 输出:ZIP 存档中打包的第一个文件的解压缩内容
// 解析 ZIP 存档
//(有关详细信息,请参阅 'http://en.wikipedia.org/wiki/ZIP_%28file_format%29')
// 解析 ZIP 存档中第一个文件条目的“本地文件头”
if(strlen($ZIPContentStr)<102){
// 任何小于 102 字节的 ZIP 文件都是无效的
printf("error: 输入数据太短<br />\n");
return
'';
}
$CompressedSize=binstrtonum(substr($ZIPContentStr,18,4));
$UncompressedSize=binstrtonum(substr($ZIPContentStr,22,4));
$FileNameLen=binstrtonum(substr($ZIPContentStr,26,2));
$ExtraFieldLen=binstrtonum(substr($ZIPContentStr,28,2));
$Offs=30+$FileNameLen+$ExtraFieldLen;
$ZIPData=substr($ZIPContentStr,$Offs,$CompressedSize);
$Data=gzinflate($ZIPData);
if(
strlen($Data)!=$UncompressedSize){
printf("error: 解压缩数据的大小错误<br />\n");
return
'';
}
else return
$Data;
}

function
binstrtonum($Str){
// 返回一个以字符串形式传递的原始二进制数据表示的数字。
// 这在从文件读取整数时很有用,
// 当我们只有文件内容作为一个字符串时。
// 示例:
// chr(0xFF) 将得到 255
// chr(0xFF).chr(0xFF).chr(0x00).chr(0x00) 将得到 65535
// chr(0xFF).chr(0xFF).chr(0xFF).chr(0x00) 将得到 16777215
$Num=0;
for(
$TC1=strlen($Str)-1;$TC1>=0;$TC1--){ // 从最高有效字节开始
$Num<<=8; // 左移一个字节(8 位)
$Num|=ord($Str[$TC1]); // 添加新字节
}
return
$Num;
}
?>

享受吧!!!
wdim
2
bushj at rpi dot edu
17 年前
我创建了一个 zip 流处理程序,以防您的发行版没有使用新的 ZipArchive 系统的内置处理程序。这个处理程序还具有根据索引和名称获取条目的功能。它的功能类似于内置的 gzip/bzip2 压缩流处理程序(http://us2.php.net/manual/en/wrappers.compression.php),但它不支持写入。

使用方法
fopen('zip://absolute/path/to/file.zip?entryname', $mode) 或
fopen('zip://absolute/path/to/file.zip#entryindex', $mode) 或
fopen('zip://absolute/path/to/file.zip', $mode)

$mode 只能是 'r' 或 'rb'。在最后一种情况下,将使用 zip 文件中的第一个条目。

<?php
class ZipStream {
public
$zip; // 压缩文件
public $entry; // 打开的压缩条目
public $length; // 压缩条目的解压缩大小
public $position; // 当前压缩条目读取位置
// 打开压缩文件,然后检索并打开条目以进行流式传输
public function stream_open($path, $mode, $options, &$opened_path) {
if (
$mode != 'r' && $mode != 'rb') // 只接受 r 和 rb 模式,不写入!
return false;
$path = 'file:///'.substr($path, 6); // 将 file:/// 替换为 zip:// 以便我们能够使用 url_parse
$url = parse_url($path);
// 打开压缩文件
$filename = $url['path'];
$this->zip = zip_open($filename);
if (!
is_resource($this->zip))
return
false;

// 如果给出条目名称,则查找该条目
if (array_key_exists('query', $url) && $url['query']) {
$path = $url['query'];
do {
$this->entry = zip_read($this->zip);
if (!
is_resource($this->entry))
return
false;
} while (
zip_entry_name($this->entry) != $path);
} else {
// 否则按索引获取(默认值为 0)
$id = 0;
if (
array_key_exists('fragment', $url) && is_int($url['fragment']))
$id = $url['fragment']*1;
for (
$i = 0; $i <= $id; $i++) {
$this->entry = zip_read($this->zip);
if (!
is_resource($this->entry))
return
false;
}
}
// 设置长度并打开条目以供读取
$this->length = zip_entry_filesize($this->entry);
$this->position = 0;
zip_entry_open($this->zip, $this->entry, $mode);
return
true;
}
// 关闭压缩条目和文件
public function stream_close() { @zip_entry_close($this->entry); @zip_close($this->zip); }
// 返回已从压缩条目中读取的字节数
public function stream_tell() { return $this->position; }
// 如果已达到压缩条目的末尾,则返回 true
public function stream_eof() { return $this->position >= $this->length; }
// 返回 stat 数组,只有 'size' 用解压缩的压缩条目大小填充
public function url_stat() { return array('dev'=>0, 'ino'=>0, 'mode'=>0, 'nlink'=>0, 'uid'=>0, 'gid'=>0, 'rdev'=>0, 'size'=>$this->length, 'atime'=>0, 'mtime'=>0, 'ctime'=>0, 'blksize'=>0, 'blocks'=>0); }
// 读取接下来的 $count 个字节,或直到压缩条目的末尾。如果未读取任何数据,则返回数据或 false。
public function stream_read($count) {
$this->position += $count;
if (
$this->position > $this->length)
$this->position = $this->length;
return
zip_entry_read($this->entry, $count);
}
}
// 注册压缩流处理程序
stream_wrapper_register('zip', 'ZipStream'); // 如果失败,则已经存在压缩流处理程序,我们将直接使用它
?>
0
vk.com/vknkk
9 年前
<?php
// 将所有 *.zip 文件(包括子文件夹)提取到当前目录(在 Win7 上开发和测试)
$files = glob('*.zip');
if (
$files)
foreach (
$files as $fl) {
$zip = zip_open($fl);
if (
is_resource($zip)) {
$dir = substr($fl, 0, -4); // 按 *.zip 文件名创建目录(提取到“*/”中)
if (!is_dir($dir))
mkdir($dir);
while (
is_resource($entry = zip_read($zip))) {
$is_file = true;
$name = zip_entry_name($entry);
$name_parts = explode('/', $name);
if (
count($name_parts) > 1) { // 处理子文件夹
$path = array_pop($name_parts);
$is_file = !empty($path);
$path = $dir;
foreach (
$name_parts as $part) {
$path .= '/'.$part;
if (!
is_dir($path))
mkdir($path);
}
}
if (
$is_file)
file_put_contents($dir.'/'.$name, zip_entry_read($entry, zip_entry_filesize($entry)));
}
zip_close($zip);
}
}
1
chris
21 年前
如果你使用 zip 函数将存档解压缩到实际文件,请注意包含子文件夹的存档。假设你正在尝试从存档中提取 foldername/filename.txt。你无法打开不存在的目录,因此你必须检查目录 foldername 是否存在,如果不存在则创建它,然后打开 foldername/filename.txt 并开始写入它。
0
rodrigo dot moraes at gmail dot com
16 年前
以下是一个更简单的扩展类,可以递归地添加整个目录,并保持相同的结构。它使用了 SPL。

<?php
class MyZipArchive extends ZipArchive
{
/**
*
* 递归地添加目录。
*
* @param string $filename 要添加的文件的路径。
*
* @param string $localname ZIP 存档中的本地名称。
*
*/
public function addDir($filename, $localname)
{
$this->addEmptyDir($localname);
$iter = new RecursiveDirectoryIterator($filename, FilesystemIterator::SKIP_DOTS);

foreach (
$iter as $fileinfo) {
if (!
$fileinfo->isFile() && !$fileinfo->isDir()) {
continue;
}

$method = $fileinfo->isFile() ? 'addFile' : 'addDir';
$this->$method($fileinfo->getPathname(), $localname . '/' .
$fileinfo->getFilename());
}
}
}
?>

[由 danbrown AT php DOT net 编辑:包含 bart AT blueberry DOT nl 在 2011 年 6 月 29 日提出的错误修复建议。 “修复无休止的迭代器,添加标志 FilesystemIterator::SKIP_DOTS”]
0
jeswanth@gmail
17 年前
大家好

下面给出了很多函数可以提取文件,但它们缺少设置文件权限。在某些服务器上,文件权限非常重要,脚本在创建第一个目录后就停止工作。因此,我在代码中添加了 chmod。代码只有一个限制,没有文件扩展名的文件既不被视为文件也不被视为目录,因此它们没有被 chmoded,但无论如何这不会影响代码。希望这有帮助。

<?php
function unpackZip($dir,$file) {
if (
$zip = zip_open($dir.$file.".zip")) {
if (
$zip) {
mkdir($dir.$file);
chmod($dir.$file, 0777);
while (
$zip_entry = zip_read($zip)) {
if (
zip_entry_open($zip,$zip_entry,"r")) {
$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
$dir_name = dirname(zip_entry_name($zip_entry));
if (
$dir_name != ".") {
$dir_op = $dir.$file."/";
foreach (
explode("/",$dir_name) as $k) {
$dir_op = $dir_op . $k;
if (
is_file($dir_op)) unlink($dir_op);
if (!
is_dir($dir_op)) mkdir($dir_op);
chmod($dir_op, 0777);
$dir_op = $dir_op . "/" ;
}
}
$fp=fopen($dir.$file."/".zip_entry_name($zip_entry),"w+");
chmod($dir.$file."/".zip_entry_name($zip_entry), 0777);
fwrite($fp,$buf);

fclose($fp);

zip_entry_close($zip_entry);
} else
return
false;
}
zip_close($zip);
}
} else
return
false;

return
true;
}

$dir = $_SERVER['DOCUMENT_ROOT']."/"."destdirectory/";
$file = 'zipfilename_without_extension';
unpackZip($dir,$file);
$print = $_SERVER['DOCUMENT_ROOT'];
?>
0
bholub at chiefprojects dot com
17 年前
这将简单地将 $zip 解压缩(包括目录)到 $dir - 在此示例中,zip 正在上传。
<?php
$dir
= 'C:\\reports-temp\\';
$zip = zip_open($_FILES['report_zip']['tmp_name']);
while(
$zip_entry = zip_read($zip)) {
$entry = zip_entry_open($zip,$zip_entry);
$filename = zip_entry_name($zip_entry);
$target_dir = $dir.substr($filename,0,strrpos($filename,'/'));
$filesize = zip_entry_filesize($zip_entry);
if (
is_dir($target_dir) || mkdir($target_dir)) {
if (
$filesize > 0) {
$contents = zip_entry_read($zip_entry, $filesize);
file_put_contents($dir.$filename,$contents);
}
}
}
?>
0
angelnsn1 at hotmail dot com
18 年前
此函数提取所有文件和子目录,你可以选择详细模式以获取提取文件的路径。该函数返回一个消息,指示错误,如果消息为 OK,则所有操作都已完成。

---

代码

<?php
function unzip($dir, $file, $verbose = 0) {

$dir_path = "$dir$file";
$zip_path = "$dir$file.zip";

$ERROR_MSGS[0] = "OK";
$ERROR_MSGS[1] = "Zip 路径 $zip_path 不存在.";
$ERROR_MSGS[2] = "目录 $dir_path 用于解压缩包已存在,无法继续.";
$ERROR_MSGS[3] = "打开 $zip_path 文件时出错.";

$ERROR = 0;

if (
file_exists($zip_path)) {

if (!
file_exists($dir_path)) {

mkdir($dir_path);

if ((
$link = zip_open($zip_path))) {

while ((
$zip_entry = zip_read($link)) && (!$ERROR)) {

if (
zip_entry_open($link, $zip_entry, "r")) {

$data = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
$dir_name = dirname(zip_entry_name($zip_entry));
$name = zip_entry_name($zip_entry);

if (
$name[strlen($name)-1] == '/') {

$base = "$dir_path/";

foreach (
explode("/", $name) as $k) {

$base .= "$k/";

if (!
file_exists($base))
mkdir($base);

}

}
else {

$name = "$dir_path/$name";

if (
$verbose)
echo
"正在解压缩: $name<br>";

$stream = fopen($name, "w");
fwrite($stream, $data);

}

zip_entry_close($zip_entry);

}
else
$ERROR = 4;

}

zip_close($link);

}
else
$ERROR = "3";
}
else
$ERROR = 2;
}
else
$ERROR = 1;

return
$ERROR_MSGS[$ERROR];

}
?>

---

示例

<?php
$error
= unzip("d:/www/dir/", "zipname", 1);

echo
$error;
?>

---

希望这对你有所帮助,
再见.
0
ringu at mail dot ru
18 年前
我试图找到一个函数,它可以显示 zip 存档中是否存在文件。当然,我没找到。所以我自己写了一个。

首先,它会检查存档中的文件列表,如果找不到所有文件,函数将返回 FALSE

<?php
function zipx_entries_exists()
{
$names=array();
$args=func_get_args();
$far_size=count($args);
if(
$args[0])
{
for(;
$zip_entry=zip_read($args[0]); $names[]= zip_entry_name($zip_entry));
for(
$x=1; $x<=$far_size; $t+=in_array($args[$x], $names), $x++);
return
$t==--$far_size;
}else{
return
'描述符中没有 zip 文件!';
}
}

示例:
$zip=zip_open('any_zip_file_zip');
var_dump(zip_entries_exists($zip, 'photo_1.jpg', 'photo_2.jpg'));

第二个 函数 尝试 在 zip 中找到文件,如果 找不到它 返回 一个 字符串,包含 未找到 的文件 名称,并 指定的 分隔符分隔:

function
zipx_entries_nonexists_list()
{
$names=array();
$args=func_get_args();
$m=NULL;
$far_size=count($args);
if(
$args[0])
{
for(;
$zip_entry=zip_read($args[0]); $names[]= zip_entry_name($zip_entry));
for(
$x=2; $x<=$far_size; $m.=(in_array($args[$x], $names) ? NULL : $args[$x].$args[1]), $x++);
return
trim($m, $args[1]);
}else{
return
'描述符中没有 zip 文件!';
}
}
?>

示例
<?php
$zip
=zip_open('any_zip_file_zip');
var_dump(zip_entries_nonexists_list($zip, '<br />', 'photo_1.jpg', 'photo_2.jpg'));
?>

它将返回未找到的文件
photo_1.jpg<br />photo_2.jpg
0
krishnendu at spymac dot com
20 年前
如果你想用 php 解压缩一个受密码保护的文件,试试以下命令。它在 Unix/Apache 环境中有效。我在其他环境中没有测试过...

system("`which unzip` -P Password $zipfile -d $des",$ret_val)

其中 $zipfile 是要解压缩的 .zip 文件的路径,$des 是目标目录的路径。这里,脚本(包含此 system 命令)的绝对路径和相对路径都将有效。

如果一切顺利,文件应该解压缩到 $des 目录,并且 $ret_val 将返回 0,这意味着成功(info-zip.org)

此致
Krishnendu
0
travis
21 年前
注意 - 使用前面提到的动态 zip 类似乎会导致高 ASCII 字符出现问题(它们的 value 不会正确保存,文件将无法解压缩)
-1
phillpafford+php at gmail dot com
16 年前
你可以直接使用 linux 命令

<?php

// 获取日期
$date = date("m-d-y");

// 创建压缩文件名
$zipname = "archive/site-script-backup." . $date . ".zip";

// 创建压缩文件
$cmd = `zip -r $zipname *`;

?>
-1
shadowbranch at gmail dot com
12 年前
这是最简单的解压缩文件方法。将文件名传递给函数,它会将文件解压缩到脚本的当前目录,并在类 Unix 操作系统上正确设置权限。更易于理解和阅读。

<?php
function unzip($file){
$zip = zip_open($file);
if(
is_resource($zip)){
$tree = "";
while((
$zip_entry = zip_read($zip)) !== false){
echo
"Unpacking ".zip_entry_name($zip_entry)."\n";
if(
strpos(zip_entry_name($zip_entry), DIRECTORY_SEPARATOR) !== false){
$last = strrpos(zip_entry_name($zip_entry), DIRECTORY_SEPARATOR);
$dir = substr(zip_entry_name($zip_entry), 0, $last);
$file = substr(zip_entry_name($zip_entry), strrpos(zip_entry_name($zip_entry), DIRECTORY_SEPARATOR)+1);
if(!
is_dir($dir)){
@
mkdir($dir, 0755, true) or die("Unable to create $dir\n");
}
if(
strlen(trim($file)) > 0){
$return = @file_put_contents($dir."/".$file, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)));
if(
$return === false){
die(
"Unable to write file $dir/$file\n");
}
}
}else{
file_put_contents($file, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)));
}
}
}else{
echo
"Unable to open zip file\n";
}
}
?>
-1
mmj48 at gmail dot com
16 年前
这是我编写的一个函数,它将提取一个具有相同目录结构的压缩文件...

享受

<?php
function unzip($zipfile)
{
$zip = zip_open($zipfile);
while (
$zip_entry = zip_read($zip)) {
zip_entry_open($zip, $zip_entry);
if (
substr(zip_entry_name($zip_entry), -1) == '/') {
$zdir = substr(zip_entry_name($zip_entry), 0, -1);
if (
file_exists($zdir)) {
trigger_error('Directory "<b>' . $zdir . '</b>" exists', E_USER_ERROR);
return
false;
}
mkdir($zdir);
}
else {
$name = zip_entry_name($zip_entry);
if (
file_exists($name)) {
trigger_error('File "<b>' . $name . '</b>" exists', E_USER_ERROR);
return
false;
}
$fopen = fopen($name, "w");
fwrite($fopen, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)), zip_entry_filesize($zip_entry));
}
zip_entry_close($zip_entry);
}
zip_close($zip);
return
true;
}
?>
-1
tom
19 年前
如果您只想解压缩一个压缩文件夹,以下是下面一些冗长函数的替代方法

<?php

function unzip($zip_file, $src_dir, $extract_dir)
{
copy($src_dir . "/" . $zip_file, $extract_dir . "/" . $zip_file);
chdir($extract_dir);
shell_exec("unzip $zip_file");
}

?>

您不需要为此使用 ZIP 扩展。
-2
candido1212 at yahoo dot com dot br
19 年前
新的解压缩函数,递归提取
需要 mkdirr()(递归创建目录)

<?php
$file
= "2537c61ef7f47fc3ae919da08bcc1911.zip";
$dir = getcwd();
function
Unzip($dir, $file, $destiny="")
{
$dir .= DIRECTORY_SEPARATOR;
$path_file = $dir . $file;
$zip = zip_open($path_file);
$_tmp = array();
$count=0;
if (
$zip)
{
while (
$zip_entry = zip_read($zip))
{
$_tmp[$count]["filename"] = zip_entry_name($zip_entry);
$_tmp[$count]["stored_filename"] = zip_entry_name($zip_entry);
$_tmp[$count]["size"] = zip_entry_filesize($zip_entry);
$_tmp[$count]["compressed_size"] = zip_entry_compressedsize($zip_entry);
$_tmp[$count]["mtime"] = "";
$_tmp[$count]["comment"] = "";
$_tmp[$count]["folder"] = dirname(zip_entry_name($zip_entry));
$_tmp[$count]["index"] = $count;
$_tmp[$count]["status"] = "ok";
$_tmp[$count]["method"] = zip_entry_compressionmethod($zip_entry);

if (
zip_entry_open($zip, $zip_entry, "r"))
{
$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
if(
$destiny)
{
$path_file = str_replace("/",DIRECTORY_SEPARATOR, $destiny . zip_entry_name($zip_entry));
}
else
{
$path_file = str_replace("/",DIRECTORY_SEPARATOR, $dir . zip_entry_name($zip_entry));
}
$new_dir = dirname($path_file);

// Create Recursive Directory
mkdirr($new_dir);


$fp = fopen($dir . zip_entry_name($zip_entry), "w");
fwrite($fp, $buf);
fclose($fp);

zip_entry_close($zip_entry);
}
echo
"\n</pre>";
$count++;
}

zip_close($zip);
}
}
Unzip($dir,$file);
?>
To Top