multiples - descargar carpeta zip php
ZIP todos los archivos en el directorio y descarga.zip generado (4)
======= Solución de trabajo! ======
incluye todas las subcarpetas:
<?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'';}
?>
Al principio, incluye este pedazo de código .
Bueno, primero que nada, esta es mi estructura de carpetas:
images/
image1.png
image11.png
image111.png
image223.png
generate_zip.php
Y este es el mío generic_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");
?>
¿Cómo reunir todos los archivos de la carpeta "images /", excepto "generate_zip.php", y convertirlo en un archivo .zip descargable? En este caso, la carpeta "images /" siempre tiene una imagen diferente. ¿Es eso posible?
Como solo necesita archivos específicos de un directorio para crear ZipArchive, puede usar la función glob() para hacer esto.
<?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");
?>
No use glob () si intenta enumerar archivos en un directorio donde se almacenan muchos archivos (más de 100.000). Aparece el error "Tamaño de memoria permitido de XYZ bytes agotados ...".
readdir() es una manera más estable.
Esto asegurará que no se agregue un archivo con la extensión .php:
foreach ($files as $file) {
if(!strstr($file,''.php'')) $zip->addFile($file);
}
edición: aquí está el código completo reescrito:
<?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");
?>
cambia tu bucle foreach a esto a excepción de generate_zip.php
foreach ($files as $file) {
if($file != "generate_zip.php"){
$zip->addFile($file);
}
}