Unzip "al aire"

Iniciado por dimitrix, 22 Julio 2016, 12:14 PM

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

dimitrix

¡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!




Adrialmend

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.

dimitrix

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!




Adrialmend

Cita de: dimitrix 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!

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.


engel lex

dejar en la rutina que se limpie el directorio si consigue algo
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

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 (php) [Seleccionar]
// Recursively remove the directory with all its content
public function removeDirectory($path) {

    $exit = FALSE;

    if ( FALSE !== $path && is_dir($path) ) {

        $files = new FilesystemIterator($path, FilesystemIterator::SKIP_DOTS);

        foreach ($files as $file) {
            (is_dir($file)) ? $this->removeDirectory($file) : unlink($file);
        }

        $exit = rmdir($path);
    }

    return $exit;
}


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

Código (php) [Seleccionar]
// Supongo que esto lo tendrás en tu index.php (donde declaras e inicializas las clases)
require('functions.php');
$functions = new functions();

// aquí generas el nombre aleatorio y creas la carpeta
$folder = '';
if (!mkdir($folder)) {
    // no se pudo crear la carpeta
}

// Para comprobar que existe usamos la función realpath()
// que devolverá FALSE si no existe, o la ruta si existe
$path = realpath('/home/user/website.com/' . $folder);

if ( FALSE !== $path ) {

    // Ahora es donde entra try/catch/finally en acción
    try {

        // aquí puedes hacer la operación con total seguridad
        // ya que si falla, se ejecutará lo que haya en catch/finally {}

        // cualquier error (else if o $mysqli->error) lo puedes manejar con
        throw new Exception('mensaje de error con variable: ' $variable);

        // por ejemplo
        if ($x == $y) {
        } else throw new Exception('x (' . $x . ' no es igual a y (' . $y . ')');

    } catch (Exception $e) {

        // aquí puedes loguear que ha habido un error
        // el mensaje de error se encuentra dentro de $e
        // viene bien para debuguear y estar pendiente de los listillos

    } finally {

        // finalmente se limpian los archivos temporales
        // esto se ejecutará siempre despues de lo que hay en try, y en caso de fallar, lo de catch
        $functions->removeDirectory($path);

    }

}


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.

Adrialmend

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

dimitrix

Muchas gracias a todos!




#!drvy

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



Código (php) [Seleccionar]
<?php

$zip 
= new ZipArchive();
$zip->open('readme.zip');

/* Obtener lista con los archivos dentro del ZIP */
for($fileIndex 0$files=array(); $fileIndex $zip->numFiles; ++$fileIndex){
    
$files[$fileIndex] = $zip->getNameIndex($fileIndex);
}

print_r($files);


/* Buscar un archivo concreto y obtener su contenido
    El getFromName se puede hacer directamente sin listar archivos
    pero es para ver el ejemplo xD
*/

if(in_array('readme.txt'$files)){
    
$readme $zip->getFromName('readme.txt');
} else {
    
$readme 'No existe ese archivo.';
}

echo 
PHP_EOL$readmePHP_EOL;


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

Saludos