Создайте zip-архив с ZipArchive и включите реальные файлы ссылок Symboli c - PullRequest
0 голосов
/ 18 апреля 2020

Мы создаем структуру папок следующим образом:

/
/index.html
/css
/css/custom.css
/css/vendor/main.css <-- this is a working symbolic like

Теперь мы не хотим упаковывать всю папку в zip-архив. Пока это работает, но это не обрабатывает символические ссылки правильно. В какой-то системе он просто игнорирует их, в другой - вводит абсолютный путь. Как мы можем заставить следовать символической ссылке и скопировать реальный файл в «символьную структуру».

public static function zip_files(Event $event, $source, $destination)
{
    $zip = new \ZipArchive();
    if ($zip->open($destination, \ZIPARCHIVE::CREATE) === true) {
        $source = realpath($source);
        if (is_dir($source)) {
            $iterator = new \RecursiveDirectoryIterator($source);
            $iterator->setFlags(\RecursiveDirectoryIterator::SKIP_DOTS);
            $files = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::SELF_FIRST);
            foreach ($files as $file) {
                $file = realpath($file);
                if (is_dir($file)) {
                    $zip->addEmptyDir(str_replace($source . DIRECTORY_SEPARATOR, '', $file . DIRECTORY_SEPARATOR));
                } elseif (is_file($file)) {
                    $zip->addFile($file, str_replace($source . DIRECTORY_SEPARATOR, '', $file));
                }
            }
        } elseif (is_file($source)) {
            $zip->addFile($source, basename($source));
        }
    }
    $event->getIO()->write(sprintf('<info>Created/Updated "%s" in "%s"<info>', $source, $destination));
    return $zip->close();
}

Foreach, где мы его называем.

    foreach ($archives as $OutputZipName => $RelativeFolderToBeZipped) {


        $source = realpath($RelativeFolderToBeZipped);
        $fileName = $OutputZipName . '.zip';

        $destination = realpath($outputFolder['dir']) . DIRECTORY_SEPARATOR . $fileName;

        self::zip_files($event, $source, $destination);
    }
...