我想下载一个zip存档并使用PHP将其解压缩到内存中。
这就是我今天所拥有的(而且对我来说文件处理太多了:)):
// download the data file from the real page
copy("http://www.curriculummagic.com/AdvancedBalloons.kmz", "./data/zip.kmz");
// unzip it
$zip = new ZipArchive;
$res = $zip->open('./data/zip.kmz');
if ($res === TRUE) {
$zip->extractTo('./data');
$zip->close();
}
// use the unzipped files...
答案 0 :(得分:13)
警告:这在内存中无法完成 - ZipArchive
无法使用“内存映射文件”。
您可以使用file_get_contents
Docs将zip文件中的文件数据获取到变量(内存)中,因为它支持zip://
Stream wrapper Docs:
$zipFile = './data/zip.kmz'; # path of zip-file
$fileInZip = 'test.txt'; # name the file to obtain
# read the file's data:
$path = sprintf('zip://%s#%s', $zipFile, $fileInZip);
$fileData = file_get_contents($path);
您只能使用zip://
或ZipArchive访问本地文件。为此,您可以先将内容复制到临时文件中并使用它:
$zip = 'http://www.curriculummagic.com/AdvancedBalloons.kmz';
$file = 'doc.kml';
$ext = pathinfo($zip, PATHINFO_EXTENSION);
$temp = tempnam(sys_get_temp_dir(), $ext);
copy($zip, $temp);
$data = file_get_contents("zip://$temp#$file");
unlink($temp);
答案 1 :(得分:2)
一样简单:
$zipFile = "test.zip";
$fileInsideZip = "somefile.txt";
$content = file_get_contents("zip://$zipFile#$fileInsideZip");
答案 2 :(得分:1)
旧主题但仍然相关,因为我问自己同样的问题,但没有找到答案。
我最终编写了这个函数,它返回一个数组,其中包含存档中包含的每个文件的名称,以及该文件的解压缩内容:
function GetZipContent(String $body_containing_zip_file) {
$sectors = explode("\x50\x4b\x01\x02", $data);
array_pop($sectors);
$files = explode("\x50\x4b\x03\x04", implode("\x50\x4b\x01\x02", $sectors));
array_shift($files);
$result = array();
foreach($files as $file) {
$header = unpack("vversion/vflag/vmethod/vmodification_time/vmodification_date/Vcrc/Vcompressed_size/Vuncompressed_size/vfilename_length/vextrafield_length", $file);
array_push($result, [
'filename' => substr($file, 26, $header['filename_length']),
'content' => gzinflate(substr($file, 26 + $header['filename_length'], -12))
]);
}
return $result;
}
希望这是有用的...
答案 3 :(得分:0)
您可以获取zip中文件的流并将其提取到变量中:
$fp = $zip->getStream('test.txt');
if(!$fp) exit("failed\n");
while (!feof($fp)) {
$contents .= fread($fp, 1024);
}
fclose($fp);
答案 4 :(得分:0)
如果你可以使用系统调用,最简单的方法应该是这样的(bzip2 case)。你只需使用标准输出。
$out=shell_exec('bzip2 -dkc '.$zip);