В памяти скачать и распаковать zip архив - PullRequest
7 голосов
/ 12 сентября 2011

Я бы хотел скачать 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...

Ответы [ 4 ]

14 голосов
/ 12 сентября 2011

Предупреждение : это невозможно сделать в памяти - ZipArchive не может работать с «файлами отображения памяти» .

Вы можете получить данные файла из zip-файла в переменную (память) с помощью file_get_contents Документы , поскольку она поддерживает zip:// Оболочка потока Документы :

$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);
2 голосов
/ 08 мая 2016

Так же просто, как:

$zipFile = "test.zip";
$fileInsideZip = "somefile.txt";
$content = file_get_contents("zip://$zipFile#$fileInsideZip");
0 голосов
/ 11 мая 2015

Если вы можете использовать системные вызовы, самый простой способ должен выглядеть следующим образом (случай bzip2).Вы просто используете стандартный вывод.

$out=shell_exec('bzip2 -dkc '.$zip);
0 голосов
/ 12 сентября 2011

Вы можете получить поток в файл внутри zip и извлечь его в переменную:

$fp = $zip->getStream('test.txt');
if(!$fp) exit("failed\n");

while (!feof($fp)) {
    $contents .= fread($fp, 1024);
}

fclose($fp);
...