PHP Загрузка zip, созданного с помощью ziparchive

Я новичок в PHP и пытаюсь создать функцию ZIP, которая вызывается через ajax и загружается пользователю. Я получаю положительный ответ с zip, но потоковая передача выдает мне ошибку для файла (): stat failed for ../test.zip, а также не удалось прочитать файл для открытия потока, такого файла или каталога нет на php-странице. Вот мой код ниже - я довольно сильно обжегся и не могу найти ответ, который имеет смысл для моей ситуации.

    <?php
    require("../../common.php");
    ini_set('display_startup_errors',1);
    ini_set('display_errors',1);
    error_reporting(-1);
$thisdir = " ";
$zip = new ZipArchive();
$filename = "../test.zip";
if ($zip->open($filename, ZipArchive::CREATE)!==TRUE) {
    exit("cannot open <$filename>\n");
}
$zip->addFromString('insert.pdf' . time(), "#1 This is a test string added as testfilephp.txt.\n");;
$zip->addFile($filename . "../../../folder/pdf_folder/");
echo "numfiles: " . $zip->numFiles . "\n";
echo "status:" . $zip->status . "\n";
echo $filename;
//$size = filesize($zip->filename);
$zip->close();
header("Content-type: application/zip"); 
header("Content-Disposition: attachment; filename=$filename");
header("Content-length: " . filesize($filename));
header("Pragma: no-cache"); 
header("Expires: 0"); 
readfile("$filename");
?>

спасибо за любую помощь или руководство

****** редактировать здесь ошибка для кода

Предупреждение. /zipAJAX.php в строке 21

Предупреждение: readfile(../test.zip): не удалось открыть поток: Нет такого файла или каталога в /var/---/----/---/----/control/ajax/zipAJAX.php в строке 24


person Bludino    schedule 27.06.2018    source источник
comment
Не могли бы вы скопировать сообщение об ошибке и трассировку стека в вопрос?   -  person ren.rocks    schedule 27.06.2018
comment
Что это? $zip->addFile('../test.zip../../../folder/pdf_folder/')? Должны быть два аргумента, разделенные запятой? Также мне не нравятся несоответствия/двойственность $filename и $zip->filename - возможно, просто избегайте этого, я понимаю, что вы, вероятно, занимались отладкой.   -  person ficuscr    schedule 27.06.2018


Ответы (1)


Вы не можете добавить содержимое папки в zip-файл с помощью метода addFile. Вы должны зациклить каталог (http://php.net/dir) и добавить каждый файл в свой почтовый индекс с помощью метода addFile.

Прежде чем отправлять какие-либо данные обратно пользователю, вы можете проверить, существует ли zip-файл.

$zip->close();
if(file_exists($file)) {
  header("Content-type: application/zip"); 
  header("Content-Disposition: attachment; filename=$filename");
  header("Content-length: " . filesize($filename));
  header("Pragma: no-cache"); 
  header("Expires: 0"); 
  readfile("$filename");
}

Также убедитесь, что у пользователя есть права на запись в каталог, в который вы хотите поместить zip-файл.

person Stijn Leenknegt    schedule 27.06.2018