elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  Unzip "al aire"
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Unzip "al aire"  (Leído 4,431 veces)
dimitrix


Desconectado Desconectado

Mensajes: 4.847



Ver Perfil WWW
Unzip "al aire"
« en: 22 Julio 2016, 12:14 pm »

¡Hola a todos!

Tengo una duda, necesitaría crear una función que descomprima un zip en una carpeta temporal.

Y que pueda acceder a cada uno de los ficheros de esa carpeta, pero que, al terminar el PHP se borrara todo, sin que yo le diga nada.

Esto lo digo más que nada por si a mitad proceso, ocurre un error, que no se guarde basura que luego no se borre.

¿Cómo lo podría hacer?

Un abrazo!


En línea




Adrialmend

Desconectado Desconectado

Mensajes: 38


Ver Perfil
Re: Unzip "al aire"
« Respuesta #1 en: 22 Julio 2016, 13:04 pm »

http://es.php.net/manual/es/refs.compression.php

Puede que te sirva.

No se si te seré util pero a ver:

- Creas una carpeta aleatoria y le guardas el nombre en una variable.
- Extras el contenido en esa carpeta (con el enlace anterior)
- Haces lo que tengas que hacer
- Borras todo el contenido http://blog.freshware.es/php-eliminar-directorio-y-contenido/


No se si te servirá de ayuda.

Un saludo.


En línea

dimitrix


Desconectado Desconectado

Mensajes: 4.847



Ver Perfil WWW
Re: Unzip "al aire"
« Respuesta #2 en: 22 Julio 2016, 18:23 pm »

Hola Adrialmend, antes que nada, gracias por el mensaje.

Había pensado en eso, pero lo que busco es algo que se borre (quizás en tmp) sin tener que borrarlo yo, más que nada por si PHP es interrumpido y falla par aque no se quede de por vida.

Un abrazo!
En línea




Adrialmend

Desconectado Desconectado

Mensajes: 38


Ver Perfil
Re: Unzip "al aire"
« Respuesta #3 en: 22 Julio 2016, 18:29 pm »

Hola Adrialmend, antes que nada, gracias por el mensaje.

Había pensado en eso, pero lo que busco es algo que se borre (quizás en tmp) sin tener que borrarlo yo, más que nada por si PHP es interrumpido y falla par aque no se quede de por vida.

Un abrazo!

Supongo que todo el script lo harás a la vez. También supongo que con esos datos los harás algo y luego borrarás. El codigo irá en un mismo script y será automatico, no tienes que tocar nada.

Si puedes danos más pistas e intentaré ayudarte.

PD: Perdona si no te estoy entendiendo  ;D

Un saludo y de nada, para eso estamos para ayudarnos.

En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Unzip "al aire"
« Respuesta #4 en: 22 Julio 2016, 19:38 pm »

dejar en la rutina que se limpie el directorio si consigue algo
En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
gAb1


Desconectado Desconectado

Mensajes: 731


Ver Perfil
Re: Unzip "al aire"
« Respuesta #5 en: 22 Julio 2016, 19:43 pm »

Eso suena a trabajo de las excepciones PHP. Con los bloques try y catch (opcionalmente finally en php 7 o era 5.6?) podrás manejar las excepciones que hayas definido (cuando algo no sale como quieres).

Sería algo así:

- Primero la función que elimina el directorio y todo lo que contiene (esto serviria para muchas otras cosas, asi que lo puedes poner en tu clase functions, o como la llames):

Código
  1. // Recursively remove the directory with all its content
  2. public function removeDirectory($path) {
  3.  
  4.    $exit = FALSE;
  5.  
  6.    if ( FALSE !== $path && is_dir($path) ) {
  7.  
  8.        $files = new FilesystemIterator($path, FilesystemIterator::SKIP_DOTS);
  9.  
  10.        foreach ($files as $file) {
  11.            (is_dir($file)) ? $this->removeDirectory($file) : unlink($file);
  12.        }
  13.  
  14.        $exit = rmdir($path);
  15.    }
  16.  
  17.    return $exit;
  18. }

- Ahora el script en sí, lo que querias hacer:

Código
  1. // Supongo que esto lo tendrás en tu index.php (donde declaras e inicializas las clases)
  2. require('functions.php');
  3. $functions = new functions();
  4.  
  5. // aquí generas el nombre aleatorio y creas la carpeta
  6. $folder = '';
  7. if (!mkdir($folder)) {
  8.    // no se pudo crear la carpeta
  9. }
  10.  
  11. // Para comprobar que existe usamos la función realpath()
  12. // que devolverá FALSE si no existe, o la ruta si existe
  13. $path = realpath('/home/user/website.com/' . $folder);
  14.  
  15. if ( FALSE !== $path ) {
  16.  
  17.    // Ahora es donde entra try/catch/finally en acción
  18.    try {
  19.  
  20.        // aquí puedes hacer la operación con total seguridad
  21.        // ya que si falla, se ejecutará lo que haya en catch/finally {}
  22.  
  23.        // cualquier error (else if o $mysqli->error) lo puedes manejar con
  24.        throw new Exception('mensaje de error con variable: ' $variable);
  25.  
  26.        // por ejemplo
  27.        if ($x == $y) {
  28.        } else throw new Exception('x (' . $x . ' no es igual a y (' . $y . ')');
  29.  
  30.    } catch (Exception $e) {
  31.  
  32.        // aquí puedes loguear que ha habido un error
  33.        // el mensaje de error se encuentra dentro de $e
  34.        // viene bien para debuguear y estar pendiente de los listillos
  35.  
  36.    } finally {
  37.  
  38.        // finalmente se limpian los archivos temporales
  39.        // esto se ejecutará siempre despues de lo que hay en try, y en caso de fallar, lo de catch
  40.        $functions->removeDirectory($path);
  41.  
  42.    }
  43.  
  44. }

Sencillo, ¿no?  :)

Esto es más que nada para que te hagas una idea de como funciona, la idea básica es esa, tener 3 bloques, dos que se ejecutan siempre (primero y ultimo) y otro que se ejecuta solo en caso de que el primero falle.

Pero no estamos hablando de errores de php, si no errores de los distintos escenarios, que no son problema del código, si no del input de los usuarios y de las distintas variables. Los errores propios de php deben ser solucionados antes de producción.
En línea

Adrialmend

Desconectado Desconectado

Mensajes: 38


Ver Perfil
Re: Unzip "al aire"
« Respuesta #6 en: 22 Julio 2016, 21:46 pm »

A eso me refería yo, a los try catch. Gracias por mencionarlo. Espero que te sirva

Gracias Gabi por el código

Un saludo
En línea

dimitrix


Desconectado Desconectado

Mensajes: 4.847



Ver Perfil WWW
Re: Unzip "al aire"
« Respuesta #7 en: 29 Julio 2016, 15:44 pm »

Muchas gracias a todos!
En línea




#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.850



Ver Perfil WWW
Re: Unzip "al aire"
« Respuesta #8 en: 29 Julio 2016, 17:07 pm »

Podrías usar el ZipArchive de PHP y evitar tener que descomprimir.



Código
  1. <?php
  2.  
  3. $zip = new ZipArchive();
  4. $zip->open('readme.zip');
  5.  
  6. /* Obtener lista con los archivos dentro del ZIP */
  7. for($fileIndex = 0, $files=array(); $fileIndex < $zip->numFiles; ++$fileIndex){
  8.    $files[$fileIndex] = $zip->getNameIndex($fileIndex);
  9. }
  10.  
  11. print_r($files);
  12.  
  13.  
  14. /* Buscar un archivo concreto y obtener su contenido
  15.     El getFromName se puede hacer directamente sin listar archivos
  16.     pero es para ver el ejemplo xD
  17. */
  18.  
  19. if(in_array('readme.txt', $files)){
  20.    $readme = $zip->getFromName('readme.txt');
  21. } else {
  22.    $readme = 'No existe ese archivo.';
  23. }
  24.  
  25. echo PHP_EOL, $readme, PHP_EOL;

Te evitas descomprimir por tu cuenta incluso aunque falle el script.
http://www.php.net/ziparchive

Saludos
« Última modificación: 29 Julio 2016, 17:11 pm por #!drvy » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines