Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Shell Root en 26 Enero 2011, 00:18 am



Título: Descargar los archivos de una carpeta de un servidor + PHP
Publicado por: Shell Root en 26 Enero 2011, 00:18 am
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?


Título: Re: Descargar los archivos de una carpeta de un servidor + PHP
Publicado por: #!drvy en 26 Enero 2011, 00:48 am
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


Título: Re: Descargar los archivos de una carpeta de un servidor + PHP
Publicado por: Shell Root en 26 Enero 2011, 00:49 am
En el mismo host donde están los archivos.


Título: Re: Descargar los archivos de una carpeta de un servidor + PHP
Publicado por: #!drvy en 26 Enero 2011, 01:19 am
Código
  1. <?php
  2. // drvy
  3. $carpeta = 'files/';
  4. $permitidos = array('php','css','html','p0rnxD');
  5. $archivo_final = 'descargas.zip';  // .zip *
  6.  
  7. $zip = new ZipArchive();
  8. if ($zip->open($archivo_final, ZIPARCHIVE::CREATE)==TRUE){
  9. if ($abrir = opendir($carpeta)) {
  10. while (false !== ($archivo = readdir($abrir))) {
  11. $extension = substr($archivo, strrpos($archivo, '.') + 1);
  12. if (in_array($extension, $permitidos)) {
  13. $zip->addFile($carpeta.$archivo,$archivo);
  14. }
  15. }
  16. closedir($abrir);
  17. } else {echo ' no se ha podido abrir la carpeta';}
  18. } else {echo 'No se ha podido crear un archivo zip!';}
  19. $zip->close();
  20. echo 'Listo';
  21.  
  22. ?>
  23.  

Lo hice algo rapidito pero funciona segun probé.



Saludos


Título: Re: Descargar los archivos de una carpeta de un servidor + PHP
Publicado por: Shell Root en 26 Enero 2011, 01:27 am
Gracias, aun no lo pruebo, pero cabe aclarar a qué dentro de httpdocs hay subcarpetas y así sucesivamente...


Título: Re: Descargar los archivos de una carpeta de un servidor + PHP
Publicado por: #!drvy en 26 Enero 2011, 02:31 am
Código
  1. <?php
  2. //drvy
  3.  
  4. $carpeta = 'files/';
  5. $permitidos = array('php','css');
  6. $archivo_final = 'descargas.zip';  // .zip *
  7. $zip = new ZipArchive();
  8. if ($zip->open($archivo_final, ZIPARCHIVE::CREATE)!=TRUE){die('No se ha podido crear un archivo zip!');}
  9.  
  10. function archivar($carpeta,$permitidos,$zip)
  11. {
  12.        $carpetas = scandir($carpeta);
  13.        foreach($carpetas as $archivo)
  14.        {
  15.                if (($archivo == '.')||($archivo == '..')){}
  16.  
  17.                elseif (is_dir($carpeta.'/'.$archivo)){
  18. archivar($carpeta.'/'.$archivo,$permitidos,$zip);
  19.  
  20. }else{
  21. $extension = substr($archivo, strrpos($archivo, '.') + 1);
  22. if (in_array($extension, $permitidos)) {
  23.                        $zip->addFile($carpeta.'/'.$archivo,$carpeta.'/'.$archivo);
  24. }
  25.                }
  26.        }
  27. }
  28.  
  29. archivar($carpeta,$permitidos,$zip);
  30. $zip->close();
  31. echo 'Listo';
  32. ?>
  33.  

Adapte un script que encontré en opendir() (http://www.php.net/manual/en/function.opendir.php#90602) 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


Título: Re: Descargar los archivos de una carpeta de un servidor + PHP
Publicado por: WHK en 26 Enero 2011, 18:23 pm
recursivo:

Código
  1. function comprimir($ruta, $zip_salida, $handle = false, $recursivo = false){
  2.  
  3.  if(!is_dir($ruta) and !is_file($ruta))
  4.   return false; /* La ruta no existe */
  5.  
  6.  /* Declara el handle del objeto */
  7.  if(!$handle){
  8.   $handle = new ZipArchive;
  9.   if ($handle->open($zip_salida, ZipArchive::CREATE) === false){
  10.    return false; /* Imposible crear el archivo ZIP */
  11.   }
  12.  }
  13.  
  14.  /* Procesa directorio */
  15.  if(is_dir($ruta)){
  16.   $ruta = dirname($ruta.'/arch.ext'); /* Aseguramos que sea un directorio sin carácteres corruptos */
  17.   $handle->addEmptyDir($ruta); /* Agrega el directorio comprimido */
  18.   foreach(glob($ruta.'/*') as $url){ /* Procesa cada directorio o archivo dentro de el */
  19.    comprimir($url, $zip_salida, $handle, true); /* Comprime el subdirectorio o archivo */
  20.   }
  21.  
  22.  /* Procesa archivo */
  23.  }else
  24.   $handle->addFile($ruta);
  25.  
  26.  /* Finaliza el ZIP si no se está ejecutando una acción recursiva en progreso */
  27.  if(!$recursivo)
  28.   $handle->close();
  29.  
  30.  return true; /* Retorno satisfactorio */
  31. }