Создайте и загрузите Zip-файл (maennchen/ZipStream-PHP)

В моем проекте мы использовали связку maennchen/ZipStream-PHP. Сейчас пытаюсь создать и скачать zip файл, но когда открываю zip файл у меня ошибка "пустой архив".

return new StreamedResponse(function() use ($filenames, $logger) {
        $filename = 'example.zip';

        $opt = new ArchiveOptions();
        $opt->setContentDisposition("attachment;filename=\"$filename\"");
        $opt->setContentType('application/octet-stream');
        $opt->setEnableZip64(false);
        $opt->setFlushOutput(true);
        $opt->setSendHttpHeaders(true);

        $zip = new ZipStream($filename, $opt);

        foreach ($filenames as $f) {
            if (true === file_exists($f)) {
                try {
                    $zip->addFileFromPath(basename($f), $f);
                } catch (\Exception $exception) {
                    $logger->error($exception->getMessage());
                }
            } else {
                $logger->error(sprintf('File %s does not exist.', $f));
            }
        }

        $zip->finish();
    });

Если я дамп $zip, то аргумент файла будет пустым. Я думаю, что метод addFile не работает.

Вы можете помочь мне?

Заранее спасибо.


person Stoads    schedule 03.01.2020    source источник


Ответы (1)


StreamedResponse от Symfony уже отправляет заголовки, поэтому вам не следует переопределять их внутри «потока».

Попробуй это;

return new StreamedResponse(function() use ($filenames, $logger) {
        $opt = new \ZipStream\Option\Archive();
        $opt->setZeroHeader(true);
        $opt->setEnableZip64(false);

        $zip = new ZipStream(null, $opt);

        foreach ($filenames as $f) {
            if (true === file_exists($f)) {
                try {
                    $zip->addFileFromPath(basename($f), $f);
                } catch (\Exception $exception) {
                    $logger->error($exception->getMessage());
                }
            } else {
                $logger->error(sprintf('File %s does not exist.', $f));
            }
        }

        $zip->finish();
    },
    200,
    [
        'Content-Disposition' => 'attachment;filename="example.zip"',
        'Content-Type' => 'application/octet-stream',
    ]);
person guillaumesmo    schedule 05.01.2020
comment
Привет, в архиве только пусто. Я пытаюсь с addFile('test.txt', 'MY CONTENT HERE!'), но то же самое...архив пуст! - person Stoads; 06.01.2020
comment
Я не уверен, что означает ваш псевдоним ArchiveOptions, убедитесь, что это \ZipStream\Option\Archive. Кроме того, добавьте ->setZeroHeader(true) в соответствии с рекомендациями их документации. я обновил свой ответ - person guillaumesmo; 07.01.2020