我正在尝试解压缩包含可能超过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不会发出警告,但似乎没有提取任何内容,猜测处理程序的类型有些错误。
如何将这个大型压缩文件部分解压缩到一个文件夹中?
答案 0 :(得分:2)
(PK)Zip和GZip是两种完全不同的格式; gzopen
无法打开zip存档。
要解压缩PKZip档案,请查看PHP Zip extension。
答案 1 :(得分:1)
<?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');
?>