Вы неправильно используете (или не используете) 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");
}
Выше приведен только ответ, потому что он слишком длинный для комментария. Ничто из вышеперечисленного не отвечает, почему: « это прекрасно работает на моем локальном хосте, но не на сервере ».