Ну, во-первых, это моя папка:
images/ image1.png image11.png image111.png image223.png generate_zip.php
И это мой generate_zip.php:
<?php $files = array($listfiles); $zipname = 'adcs.zip'; $zip = new ZipArchive; $zip->open($zipname, ZipArchive::CREATE); foreach ($files as $file) { $zip->addFile($file); } $zip->close(); header('Content-Type: application/zip'); header("Content-Disposition: attachment; filename='adcs.zip'"); header('Content-Length: ' . filesize($zipname)); header("Location: adcs.zip"); ?>
Как собрать все файлы из папки «images /», кроме «generate_zip.php», и сделать его загружаемым .zip? В этом случае папка «images /» всегда имеет другое изображение. Это возможно?
это гарантирует, что файл с расширением .php не будет добавлен:
foreach ($files as $file) { if(!strstr($file,'.php')) $zip->addFile($file); }
edit: вот полный код, переписанный:
<?php $zipname = 'adcs.zip'; $zip = new ZipArchive; $zip->open($zipname, ZipArchive::CREATE); if ($handle = opendir('.')) { while (false !== ($entry = readdir($handle))) { if ($entry != "." && $entry != ".." && !strstr($entry,'.php')) { $zip->addFile($entry); } } closedir($handle); } $zip->close(); header('Content-Type: application/zip'); header("Content-Disposition: attachment; filename='adcs.zip'"); header('Content-Length: ' . filesize($zipname)); header("Location: adcs.zip"); ?>
включает все подпапки:
<?php $the_folder = 'path/foldername'; $zip_file_name = 'archived_name.zip'; class FlxZipArchive extends ZipArchive { /** Add a Dir with Files and Subdirs to the archive;;;;; @param string $location Real Location;;;; @param string $name Name in Archive;;; @author Nicolas Heimann;;;; @access private **/ public function addDir($location, $name) { $this->addEmptyDir($name); $this->addDirDo($location, $name); } // EO addDir; /** Add Files & Dirs to archive;;;; @param string $location Real Location; @param string $name Name in Archive;;;;;; @author Nicolas Heimann * @access private **/ private function addDirDo($location, $name) { $name .= '/'; $location .= '/'; // Read all Files in Dir $dir = opendir ($location); while ($file = readdir($dir)) { if ($file == '.' || $file == '..') continue; // Rekursiv, If dir: FlxZipArchive::addDir(), else ::File(); $do = (filetype( $location . $file) == 'dir') ? 'addDir' : 'addFile'; $this->$do($location . $file, $name . $file); } } } $za = new FlxZipArchive; $res = $za->open($zip_file_name, ZipArchive::CREATE); if($res === TRUE) { $za->addDir($the_folder, basename($the_folder)); $za->close(); } else { echo 'Could not create a zip archive';} ?>
Поскольку вам нужны только определенные файлы из каталога для создания ZipArchive, вы можете использовать функцию glob () для этого.
<?php $zip = new ZipArchive; $download = 'download.zip'; $zip->open($download, ZipArchive::CREATE); foreach (glob("images/*.png") as $file) { /* Add appropriate path to read content of zip */ $zip->addFile($file); } $zip->close(); header('Content-Type: application/zip'); header("Content-Disposition: attachment; filename = $download"); header('Content-Length: ' . filesize($download)); header("Location: $download"); ?>
Не используйте glob (), если вы пытаетесь перечислить файлы в каталоге, где хранится очень много файлов (более 100 000). Вы получаете ошибку «Разрешенная память размера XYZ байтов …».
readdir () является более стабильным способом.
измените свой цикл foreach на это, кроме generate_zip.php
foreach ($files as $file) { if($file != "generate_zip.php"){ $zip->addFile($file); } }