ZIP todos los archivos en el directorio y descarga el .zip generado [duplicate]

4 minutos de lectura

ZIP todos los archivos en el directorio y descarga el
ygor montenegro

Bueno, antes que nada, esta es mi estructura de carpetas:

images/

image1.png
image11.png
image111.png
image223.png
generate_zip.php

Y este es el mio generar_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 .zip descargable? En este caso, la carpeta “images/” siempre tiene una imagen diferente. ¿Es eso posible?

ZIP todos los archivos en el directorio y descarga el
T.Todua

======= ¡Solución de trabajo!======

incluye todas las subcarpetas:

new GoodZipArchive('path/to/input/folder',    'path/to/output_zip_file.zip') ;

al principio, incluye esto pieza de código.

  • Si es la mejor solución, no lo sé, pero hice +1 porque esto también funcionó para mí.

    –Jakob Sternberg

    18 mar. 14 a las 23:11

  • Esta es una buena respuesta, pero no se basa en la pregunta que hizo OP, en la que especificó que solo le importaban los archivos de imagen de directorios individuales. Solo pensé que debería aclararse, ya que cualquiera que esté tratando de hacer exactamente lo que pidió OP encontraría que este código no hace exactamente eso.

    – Skrilled

    20 oct.


  • ¡Gracias! Solo por curiosidad, ¿cómo podemos incluir varias carpetas?

    – Nick Newman

    15 nov.

  • Estoy llamando a este archivo con un servicio de angular. El archivo no se descarga. ¿Alguna sugerencia?

    – m1crdy

    11 mar. 16 a las 15:58

  • @Ngob arreglado ahora

    – T. Todua

    28 mayo 2019 en 14:58

1641839681 54 ZIP todos los archivos en el directorio y descarga el
skrilled

esto asegurará que no se agregue un archivo con la extensión .php:

   foreach ($files as $file) {
        if(!strstr($file,'.php')) $zip->addFile($file);
    }

editar: 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");

    ?>

  • ok, pero ¿cómo listar todos los archivos del directorio images/? dentro de la matriz?

    –Ygor Montenegro

    17 jul.


  • php.net/manual/en/function.readdir.php tiene lo que necesita en ese sentido, el ejemplo n. ° 2 es probablemente el más fácil. podría extender if ($entrada!= “.” && $entrada!= “..”) a if ($entrada!= “.” && $entrada!= “..” && !strstr($entrada,’. php’)) y agregue zip en ese ciclo también en lugar de mi ejemplo anterior.

    – Skrilled

    17 jul.


  • Ya lo intenté, pero ¿cómo poner el resultado while dentro de la matriz ();?

    –Ygor Montenegro

    17 jul.

  • cambiar $archivos = array($listararchivos); a $archivos = array(); luego en el bucle while haz array_push($listfiles,$entry);

    – Skrilled

    17 jul.


  • como esto: if ($handle = opendir('../adc/')) { while (false !== ($entry = readdir($handle))) { if ($entry != "." && $entry != "..") { array_push($listfiles, "'$entry, "); } } closedir($handle); } $files = array(); aun no genera..

    –Ygor Montenegro

    17 jul.


ZIP todos los archivos en el directorio y descarga el
camino2vin

Dado que solo necesita archivos específicos de un directorio para crear ZipArchive, puede usar globo() función 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 mensaje de error “Tamaño de memoria permitido de XYZ bytes agotados…”.

leerdir() es una forma más estable.

Fui con la solución de way2vin. Sin embargo, tuve que reemplazar

$zip->addFile(“{$archivo}”);

con

$zip->addFromString(nombrebase($archivo), file_get_contents($archivo));

que hizo el truco. Encontré esto aquí: Creando un archivo .zip

cambie su ciclo foreach a esto para excepto generate_zip.php

 foreach ($files as $file) {
     if($file != "generate_zip.php"){
        $zip->addFile($file);
     }
 }

1641839681 615 ZIP todos los archivos en el directorio y descarga el
crenshaw-dev

<?php 
ob_start();
$zip = new ZipArchive; 
$zip->open('sample.zip',  ZipArchive::CREATE);
$srcDir = "C:\xampp\htdocs\uploads"; //location of the directory
$files= scandir($srcDir);
print_r($files);  // to check if files are actually coming in the array

unset($files[0],$files[1]);
foreach ($files as $file) {
    $zip->addFile($srcDir.'\'.$file, $file);
    echo "bhandari";
}
$zip->close();

$file="sample.zip";
if (headers_sent()) {
    echo 'HTTP header already sent';
} else {
    if (!is_file($file)) {
        header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
        echo 'File not found';
    } else if (!is_readable($file)) {
        header($_SERVER['SERVER_PROTOCOL'].' 403 Forbidden');
        echo 'File not readable';
    } else {
        header($_SERVER['SERVER_PROTOCOL'].' 200 OK');
        header("Content-Type: application/zip");
        header("Content-Transfer-Encoding: Binary");
        header("Content-Length: ".filesize($file));
        header("Content-Disposition: attachment; filename="".basename($file).""");
        while (ob_get_level()) {
            ob_end_clean();
          }
        readfile($file);
        exit;
    }
}



?>`enter code here`

Nota: No olvide usar ob_start(); y punto .

.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad