Распакуйте большие молнии по частям с помощью PHP в папку - PullRequest
2 голосов
/ 02 апреля 2012

Я пытаюсь распаковать zip-файл, содержащий, возможно, более 1500 pdf-файлов.Сжатый файл должен быть распакован по частям в папку, чтобы не переполнять память сервера файлом размером 20 МБ.

Я уже нашел пример того, как распаковать его по частям.Однако этот метод не создает каталог или что-то, в котором могут быть просмотрены распакованные файлы.Он создает только один файл, который не является каталогом, который снова выглядит как новый 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 не выдает предупреждение, но кажется, что ничего не извлеченозатем предположим, что обработчик имеет неправильный тип.

Как я могу разархивировать этот большой сжатый файл по частям в папку?

Ответы [ 2 ]

2 голосов
/ 02 апреля 2012

(PK) Zip и GZip - два совершенно разных формата; gzopen не может открывать zip-архивы.

Чтобы распаковать архивы PKZip, взгляните на расширение PHP Zip .

1 голос
/ 03 апреля 2012
<?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');
?>
...