Descargar los archivos de una carpeta de un servidor + PHP

Iniciado por Shell Root, 26 Enero 2011, 00:18 AM

0 Miembros y 1 Visitante están viendo este tema.

Shell Root

Como podría hacer que por ejemplo, toda la carpeta de httpdocs se descargará en mi laptop. Ya sea archivo por archivo -automaticamente- o crear un ZIP o RAR con los archivos y después descargarlo.

Si tiene un script por ahí podrían pasármelo, mientras tanto voy a construirlo. Alguna ayuda?
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

#!drvy

Suponiendo que la carpeta tiene un index donde hace lista a todos los archivos o que es un script en el mismo host donde estan los archivos ?



Saludos

Shell Root

Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

#!drvy

Código (php) [Seleccionar]

<?php
// drvy
$carpeta 'files/';
$permitidos = array('php','css','html','p0rnxD');
$archivo_final 'descargas.zip';  // .zip *

$zip = new ZipArchive();
if (
$zip->open($archivo_finalZIPARCHIVE::CREATE)==TRUE){
if ($abrir opendir($carpeta)) {
while (false !== ($archivo readdir($abrir))) {
$extension substr($archivostrrpos($archivo'.') + 1);
if (in_array($extension$permitidos)) {
$zip->addFile($carpeta.$archivo,$archivo);
}
}
closedir($abrir);
} else {echo ' no se ha podido abrir la carpeta';}
} else {echo 
'No se ha podido crear un archivo zip!';}
$zip->close();
echo 
'Listo';

?>



Lo hice algo rapidito pero funciona segun probé.



Saludos

Shell Root

Gracias, aun no lo pruebo, pero cabe aclarar a qué dentro de httpdocs hay subcarpetas y así sucesivamente...
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

#!drvy

Código (php) [Seleccionar]

<?php
//drvy

$carpeta 'files/';
$permitidos = array('php','css');
$archivo_final 'descargas.zip';  // .zip *
$zip = new ZipArchive();
if (
$zip->open($archivo_finalZIPARCHIVE::CREATE)!=TRUE){die('No se ha podido crear un archivo zip!');}

function 
archivar($carpeta,$permitidos,$zip)
{
        
$carpetas scandir($carpeta);
        foreach(
$carpetas as $archivo)
        {
                if ((
$archivo == '.')||($archivo == '..')){}

                elseif (
is_dir($carpeta.'/'.$archivo)){
archivar($carpeta.'/'.$archivo,$permitidos,$zip);

}else{
$extension substr($archivostrrpos($archivo'.') + 1);
if (in_array($extension$permitidos)) {
                        
$zip->addFile($carpeta.'/'.$archivo,$carpeta.'/'.$archivo);
}
                }
        }
}

archivar($carpeta,$permitidos,$zip);
$zip->close();
echo 
'Listo';
?>



Adapte un script que encontré en opendir() que permitia explorar todos los directorios, sub-directorios.... y las ovejas de las ovejas de una carpeta.

Lo malo es que, una vez creado el ZIP al explorarlo las carpetas no están marcadas como tal pero si son accesibles y funciona todo bien.

PD: Ten en cuenta que si hay muchos directorios y archivos es posible que el max_execution_time se sobre pase y por lo tanto no conseguir nada xD.


Saludos

WHK

recursivo:

Código (php) [Seleccionar]
function comprimir($ruta, $zip_salida, $handle = false, $recursivo = false){

  if(!is_dir($ruta) and !is_file($ruta))
   return false; /* La ruta no existe */

  /* Declara el handle del objeto */
  if(!$handle){
   $handle = new ZipArchive;
   if ($handle->open($zip_salida, ZipArchive::CREATE) === false){
    return false; /* Imposible crear el archivo ZIP */
   }
  }

  /* Procesa directorio */
  if(is_dir($ruta)){
   $ruta = dirname($ruta.'/arch.ext'); /* Aseguramos que sea un directorio sin carácteres corruptos */
   $handle->addEmptyDir($ruta); /* Agrega el directorio comprimido */
   foreach(glob($ruta.'/*') as $url){ /* Procesa cada directorio o archivo dentro de el */
    comprimir($url, $zip_salida, $handle, true); /* Comprime el subdirectorio o archivo */
   }

  /* Procesa archivo */
  }else
   $handle->addFile($ruta);

  /* Finaliza el ZIP si no se está ejecutando una acción recursiva en progreso */
  if(!$recursivo)
   $handle->close();

  return true; /* Retorno satisfactorio */
}