使用 PHP 将大 zip 部分解压到一个文件夹中
Posted
技术标签:
【中文标题】使用 PHP 将大 zip 部分解压到一个文件夹中【英文标题】:Unpack large zips in parts with PHP into a folder 【发布时间】:2012-04-02 16:31:57 【问题描述】:我正在尝试解压缩一个可能包含 1500 多个 pdf 文件的 zip 文件。压缩后的文件应分部分解压到一个文件夹中,以免一次 20mb 的文件溢出服务器内存。
我已经找到了一个关于如何分段解压缩的示例。但是,此方法不会创建可以查看解压缩文件的目录或其他内容。它只创建一个文件,而不是目录,这似乎又是一个新的 zip。
$sfp = gzopen($srcName, "rb");
$fp = fopen($dstName, "w+");
while ($string = gzread($sfp, 4096))
fwrite($fp, $string, strlen($string));
gzclose($sfp);
fclose($fp);
这个函数会创建一些看起来像另一个 zip 文件的文件,如上所述。如果我创建要首先解压缩的文件夹并将其用作 $dstName,它会发出警告,提示找不到该文件。此外,当我让它在目标链接的末尾创建一个带有“/”的“文件”时,它会发出警告。
使用 opendir 代替 fopen 不会给出警告,但似乎没有提取任何内容,猜测处理程序类型错误。
如何将这个大的压缩文件分段解压缩到一个文件夹中?
【问题讨论】:
【参考方案1】:(PK)Zip 和 GZip 是两种完全不同的格式; gzopen
无法打开 zip 档案。
要解压 PKZip 档案,请查看 php Zip extension。
【讨论】:
【参考方案2】:<?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)
//Downloading in parts
$fileSize = zip_entry_filesize($zip_entry);
while ($fileSize > 0)
$readSize = min($fileSize, 4096);
$fileSize -= $readSize;
$content = zip_entry_read($zip_entry, $readSize);
if ($content !== false)
$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");
fclose($outFile);
else
file_put_contents($file, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)));
else
echo "Unable to open zip file\n";
unzip($_SERVER['DOCUMENT_ROOT'] . '/test/testing.zip');
?>
【讨论】:
以上是关于使用 PHP 将大 zip 部分解压到一个文件夹中的主要内容,如果未能解决你的问题,请参考以下文章
突破PHP免费空间文件格式上传限制-FTP传zip,PHP解压zip文件 - 比单文件管理器更好用