Заархивировать папку после ее создания с помощью exec не приведет к созданию папки и сбою архивирования

У меня есть сценарий, который должен (по порядку):

  1. создайте папку в sys_get_temp_dir() и поместите в нее несколько файлов (выполняется в строке exec())
  2. заархивируйте папку и ее содержимое
  3. заставить загрузку на стороне клиента

Я успешно пробовал шаги 1 и 3 по отдельности, но изо всех сил пытался заставить шаг 2 работать.

Вот мой сценарий (под ошибкой, которую я получаю):

<?php
    $tmpdir = sys_get_temp_dir();
    $outdir = "download";
    $format = "ESRI Shapefile";
    $folderToZip = $tmpdir . DIRECTORY_SEPARATOR . $outdir;

    $command = "ogr2ogr -f $format $folderToZip WFS:\"https://www.wondermap.it/cgi-bin/qgis_mapserv.fcgi?&map=/home/ubuntu/qgis/projects/Demo_sci_WMS/demo_sci.qgs&SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&typename=domini_sciabili&bbox=544138,5098446,564138,5108446\" --config GDAL_HTTP_UNSAFESSL YES";

    exec($command);

    // Initialize archive object
    $zip = new ZipArchive();
    $zipFile = "download.zip";
    $zip->open($zipFile, ZipArchive::CREATE | ZipArchive::OVERWRITE);

    // Create recursive directory iterator
    /** @var SplFileInfo[] $files */
    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($folderToZip),
        RecursiveIteratorIterator::LEAVES_ONLY
    );

    foreach ($files as $name => $file)
    {
        // Skip directories (they would be added automatically)
        if (!$file->isDir())
        {
            // Get real and relative path for current file
            $filePath = $file->getRealPath();
            $relativePath = substr($filePath, strlen($folderToZip) + 1);

            // Add current file to archive
            $zip->addFile($filePath, $relativePath);
        }
    }

    // Zip archive will be created only after closing object
    $zip->close();

    header("Content-Description: File Transfer");
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename = " . $zipFile);

    readfile ($zip);
    exit();
?>

Я получаю ошибку:

Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(C:\Users\MINORA~1.ONE\AppData\Local\Temp\download,C:\Users\MINORA~1.ONE\AppData\Local\Temp\download): Impossibile trovare il percorso specificato.
Warning: Unknown: Cannot destroy the zip context in Unknown on line 0
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
624
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не знаю, был ли приведенный выше код полностью правильным, но оказалось, что ошибка заключалась в отсутствии двойных кавычек вокруг $format в $command, что, в свою очередь, не дало никаких результатов, и поэтому $folderToZip не был создан.

Я забыл поставить их, потому что думал, что строковая переменная будет включать их, но, конечно, это просто способ создания строковой переменной. Либо мне пришлось использовать $format = "'ESRI Shapefile'"; (вместо $format = "ESRI Shapefile";), либо (это то, что я сделал), мне нужно явно добавить двойные кавычки вокруг него в $command, например

$command = "ogr2ogr -f \"$format\" $folderToZip WFS:\"https://www.wondermap.it/cgi-bin/qgis_mapserv.fcgi?&map=/home/ubuntu/qgis/projects/Demo_sci_WMS/demo_sci.qgs&SERVICE=WFS&VERSION=1.1.0&REQUEST=GetFeature&typename=domini_sciabili&bbox=544138,5098446,564138,5108446\" --config GDAL_HTTP_UNSAFESSL YES";

, записывая \"$format\" вместо $format.

Другие вопросы по теме