2024年PHP日本大会

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
"保存: ".$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
15 年前
带有文件夹结构的文件解压函数的简短版本
<?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
17 年前
使用此扩展,您可以使用 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
匿名用户
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("错误:输入数据太短<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("错误:解压缩数据大小错误<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 年前
如果您分发版没有使用新的 ZipArchive 系统内置的 zip 流处理程序,我做了一个。此处理程序还具有按索引和名称获取条目的功能。它的功能类似于内置的 gzip/bzip2 压缩流处理程序(http://us2.php.net/manual/en/wrappers.compression.php),但它不支持写入。

使用方法
fopen('zip://绝对/路径/到/file.zip?entryname', $mode) 或
fopen('zip://绝对/路径/到/file.zip#entryindex', $mode) 或
fopen('zip://绝对/路径/到/file.zip', $mode)

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

<?php
class ZipStream {
public
$zip; // zip 文件
public $entry; // 已打开的 zip 条目
public $length; // zip 条目的未压缩大小
public $position; // zip 条目读取的当前位置
// 打开 zip 文件,然后检索并打开要流式传输的条目
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);
// 打开 zip 文件
$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;
}
// 关闭 zip 条目和文件
public function stream_close() { @zip_entry_close($this->entry); @zip_close($this->zip); }
// 返回已从 zip 条目读取的字节数
public function stream_tell() { return $this->position; }
// 如果已到达 zip 条目的末尾,则返回 true
public function stream_eof() { return $this->position >= $this->length; }
// 返回 stat 数组,只有 'size' 用未压缩的 zip 条目大小填充
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 个字节,或直到 zip 条目的末尾。返回数据,如果未读取任何数据则返回 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);
}
}
// 注册 zip 流处理程序
stream_wrapper_register('zip', 'ZipStream'); // 如果失败,则已经存在 zip 流处理程序,我们将只使用该程序
?>
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。代码只有一个限制,没有文件扩展名的文件既不被视为文件也不被视为目录,因此不会对其进行chmod,无论如何这不会影响代码。希望这有帮助。

<?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
18年前
这将简单地将$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_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
19 年前
我尝试查找一个函数来判断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字符出现问题(其值无法正确保存,文件无法解压)
-1
phillpafford+php at gmail dot com
16年前
你可以直接使用Linux命令

<?php

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

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

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

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

<?php
function unzip($file){
$zip = zip_open($file);
if(
is_resource($zip)){
$tree = "";
while((
$zip_entry = zip_read($zip)) !== false){
echo
"解压 ".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("无法创建 $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(
"无法写入文件 $dir/$file\n");
}
}
}else{
file_put_contents($file, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)));
}
}
}else{
echo
"无法打开zip文件\n";
}
}
?>
-1
mmj48 at gmail dot com
17 年前
这里有一个我编写的函数,它可以提取具有相同目录结构的zip文件……

享受

<?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('目录 "<b>' . $zdir . '</b>" 已存在', E_USER_ERROR);
return
false;
}
mkdir($zdir);
}
else {
$name = zip_entry_name($zip_entry);
if (
file_exists($name)) {
trigger_error('文件 "<b>' . $name . '</b>" 已存在', 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 年前
如果你只想解压一个zip文件夹,下面一些冗长的函数的替代方法是

<?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);

// 创建递归目录
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