@EvelynWaugh

Как дебажить ZIP, созданный php ZipArchive() через блокнот?

Создаю zip при переходе на страницу:
$zip = new ZipArchive();
	$file = CO2_PATH . '/pdf/zip/certificates.zip';
if ($zip->open($file, ZipArchive::CREATE) === true) {
	
	foreach ($order_items as $item) {
		$file_pdf =  get_template_directory() . "/certificate/product-{item->ID}.pdf";

		if (file_exists($file_pdf )) {
			$zip->addFile($file_pdf );
		}
	}
   $zip->close();
}
    if (isset($_POST['download'])) {
        if (file_exists($file)) {
            header('Content-Type: application/zip');
            header('Content-Disposition: attachment; filename="' . basename($file) . '"');
            header('Content-Length: ' . filesize($file));

            flush();
            readfile($file);

            unlink($file);
        }
    }

Ниже html:
<form action="" method="POST">
	<button type="submit" name="download" class="button button-thank-page  quiz_result_btn">Download certificate</button>
</form>

   <a href="<?php echo  CO2_URL . '/pdf/zip/certificates.zip'; ?>" class="button button-thank-page  quiz_result_btn"><span>Download certificate</span>

И вот если скачивать через форму POST тогда скачивается с ошибками, прилагаю скрин с блокнота здорового и больного архива. В больном выводится html, вот в этом причина наверное.
6044b8385be79422144380.png
6044b86012951160859331.png
А если скачивать через ссылку, тогда нужно повторно перезагрузиться страницу почему-то. Предпочтительно найти ответ как сделать через POST форму.
  • Вопрос задан
  • 103 просмотра
Решения вопроса 1
Compolomus
@Compolomus Куратор тега PHP
Комполом-быдлокодер
перед выводом надо сбросить буфер
$obj = new \SplFileObject($fileName);
ob_get_level() && ob_end_clean();
header($_SERVER['SERVER_PROTOCOL'] . ' 200 OK');
header('Content-Type: application/force-download');
header('Content-Description: inline; File Transfer');
header('Content-Transfer-Encoding: binary');
header('Content-Disposition: attachment; filename="' . $name . '";', false);
header('Content-Length: ' . $size);

while (!$obj->eof()) {
    $buf = $obj->fread(16384);
    print($buf);
    flush();
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
zkrvndm
@zkrvndm
Архитектор решений
На самом деле не обязательно генерировать zip на сервере, сейчас это можно делать непосредственно в браузере.

https://stuk.github.io/jszip/
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы