Функция Zip не работает должным образом на сервере - PullRequest
0 голосов
/ 16 июля 2011

Любые идеи о том, почему это прекрасно работает на моем локальном хосте, а не на сервере, на который я его загрузил?На сервере он создает zip, но не создает папки, он помещает все файлы в .zip без различия папок.

function rzip($source, $destination) {
    // create object
    $zip = new ZipArchive();
    // open archive
    if ($zip->open($destination, ZIPARCHIVE::CREATE) !== TRUE) {
        die ("Could not open archive");
    }

    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source));
    foreach ($iterator as $key=>$value) {
        $new_filename = substr($key,strrpos($key,"/") + 1);
        $zip->addFile(realpath($key), $new_filename) or die ("ERROR: Could not add file: $key");
    }

    $zip->close();
}

1 Ответ

0 голосов
/ 17 июля 2011

Вы неправильно используете (или не используете) RecursiveDirectoryIterator местами.

Во-первых, вы будете перебирать папки с точками (. и ..), что, вероятно, нежелательно; чтобы остановить это, используйте флаг SKIP_DOTS.

Далее, есть инструменты для получения пути к файлу относительно итерируемого основного каталога и для получения реального пути ; используя методы getSubPathname() и getRealpath() соответственно.

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(
                $source, RecursiveDirectoryIterator::SKIP_DOTS));
foreach ($iterator as $key => $value) {
    $localname = $iterator->getSubPathname();
    $filename  = $value->getRealpath();
    $zip->addFile($filename, $localname) or die ("ERROR: Could not add file: $key");
}

Выше приведен только ответ, потому что он слишком длинный для комментария. Ничто из вышеперечисленного не отвечает, почему: « это прекрасно работает на моем локальном хосте, но не на сервере ».

...