Рекурсивная архивация файлов и папок PHP
Всем привет и заранее спасибо за помощь! p.s. Не душите за нарушение MVC паттерна. Впервые пишу достаточно глобальный проект с его реализацией.
В общем и целом, по нажатию на кнопку необходимо либо скачивать файл сразу (если он один, если это не папка), либо, если целью скачивания является директория - закинуть все файлы и подкаталоги, находящиеся в ней в архив. Пытаюсь сделать это всё через рекурсию, но на данном этапе при попытке скачивания директории - скачивается файл который лежит глубже всех и создаются архивы папок, который лежат на пути к этому файлу.
public function downloadFile($name, $path)
{
$url = ((!empty($_SERVER['HTTPS'])) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$sdPath = $path . $name;
$ex = pathinfo($sdPath, PATHINFO_EXTENSION);
if ($ex === "") {
$zip = new \ZipArchive();
$zip->open($sdPath . ".zip", \ZipArchive::CREATE);
$files = scandir($sdPath);
unset($files[0], $files[1]);
if (count($files) === 0) {
?>
<script> alert("Папка пуста!") </script> <?php
} else {
foreach ($files as $file) {
$zip->addFile($sdPath . "/{$file}", $name . "/{$file}");
$this->downloadFile($file, $sdPath . "/");
}
$zip->close();
?>
<script>alert("Создан архив для скачивания!")</script> <?php
}
} else {
$this->model->downloadFile($sdPath);
}
}
Вот model->downloadFile():
public function downloadFile($fileName){
$ex = pathinfo($fileName, PATHINFO_EXTENSION);
$linkHash = substr($_SERVER['QUERY_STRING'], 5);
$link = mysqli_connect("localhost", "root", "root", "file-manager");
if ($ex == ""){
header("Content-Type: application/octet-stream");
header("Accept-Ranges: bytes");
header("Content-Length: ".filesize($fileName));
header("Content-Disposition: attachment; filename=". basename($fileName) .".zip");
readfile($fileName);
exit();
}
else{
header("Content-Type: application/octet-stream");
header("Accept-Ranges: bytes");
header("Content-Length: ".filesize($fileName));
header("Content-Disposition: attachment; filename=". basename($fileName));
readfile($fileName);
exit();
}
}