Descompresión de ficheros de tipo GZIP con PHP

 
En este artículo comentaremos como descomprimir los ficheros que hemos comprimido con las funciones de Compresión de ficheros con PHP a GZIP.

Este ejemplo descomprimiría un archivo con formato gzip comprimido mediante gzencode, o cualquier aplicación que comprima ficheros a gzip (como el comando gzip de Unix) y hace los siguientes pasos:
  1. Inicializa variables:
    • $iTamMaxDestino, es el tamaño máximo del fichero descomprimido, si el tamaño del fichero resultante fuera mayor, se truncaría, la parte comentada sería para establecer un tamaño máximo fijo, la segunda opción cogería el tamaño del fichero una vez descomprimido, en el formato GZIP, los últimos 4 bytes, son un "long", con el tamaño del fichero original.
    • $sNombre, es el nombre alternativo del archivo descomprimido. En caso de que el archivo sea del tipo nombre.ext.gz el nombre del fichero resultante sería nombre.ext independientemente del valor de esta variable
  2. Abre el fichero comprimido con gzopen / gzclose y recoge del fichero comprimido la cadena del fichero descomprimido con gzread
  3. Vuelca el resultado en un fichero en el mismo directorio que el original

Si el fichero que quisiéramos comprimir se hubiera creado con gzcompress ó gzdeflate, en vez de abrir el fichero como un fichero comprimido, deberíamos de abrirle en binario para recoger sus datos (realmente no es un fichero comprimido ya que le faltan las cabeceras indicadoras, realmente es un fichero con una cadena comprimida) y descomprimir estos con gzuncompress ó gzinflate según el caso, de forma que habría que reemplazar esta parte:

// Si queremos poner un maximo del archivo a descomprimir
// $iTamMaxDestino = 4000000; // 4 Megas

// Esto cogerá el tamaño del archivo a descomprimir, sea cual sea
$fFichero = fopen($sFichOrigen, "rb");
fseek($fFichero, -4, SEEK_END);
$bTamMaxDestino = fread($fFichero, 4);
$iTamMaxDestino = end(unpack("V", $bTamMaxDestino));
fclose($fFichero);

$sNombre = "McAnam.des";

if ( ! $fOrigen = @gzopen($sFichOrigen, "rb"))
return false;
$sDesBin = gzread($fOrigen, $iTamMaxDestino);
gzclose($fOrigen);


Para descomprimir un fichero comprimido con gzcompress:

$sNombre = "McAnam.des";
        
if ( ! $fOrigen = @fopen($sFichOrigen, "rb"))
return false;
$sOriGZ = fread($fOrigen, filesize($sFichOrigen));
fclose($fOrigen);

$sDesBin = gzuncompress($sOriGZ);


Para descomprimir un fichero comprimido con gzdeflate:

$sNombre = "McAnam.des";
        
if ( ! $fOrigen = @fopen($sFichOrigen, "rb"))
return false;
$sOriGZ = fread($fOrigen, filesize($sFichOrigen));
fclose($fOrigen);

$sDesBin = gzinflate($sOriGZ);


Tener en cuenta que para poder crear el fichero descomprimido en el servidor, el usuario debe tener permisos de escritura en la carpeta donde se vaya a dejar este.


Código:
<?php
    //Copyright © McAnam.com  

    function iDescomprimir($sFichOrigen){
        
        // Si queremos poner un maximo del archivo a descomprimir
        // $iTamMaxDestino = 4000000; // 4 Megas
        
        // Esto cogerá el tamaño del archivo a descomprimir, sea cual sea
        $fFichero = fopen($sFichOrigen, "rb");
        fseek($fFichero, -4, SEEK_END);
        $bTamMaxDestino = fread($fFichero, 4);
        $iTamMaxDestino = end(unpack("V", $bTamMaxDestino));
        fclose($fFichero);
        
        $sNombre = "McAnam.des";
        
        if ( ! $fOrigen = @gzopen($sFichOrigen, "rb"))
            return false;
        $sDesBin = gzread($fOrigen, $iTamMaxDestino);
        gzclose($fOrigen);

        if (strstr($sFichOrigen, ".gz"))
            $sFichDetino = substr($sFichOrigen, 0, strrpos($sFichOrigen, ".gz"));
        else if (strrpos($sFichOrigen, "\\"))
            $sFichDetino = substr($sFichOrigen, 0, strrpos($sFichOrigen, "\\") + 1).$sNombre;
        else if (strrpos($sFichOrigen, "/"))
            $sFichDetino = substr($sFichOrigen, 0, strrpos($sFichOrigen, "/") + 1).$sNombre;
        else
            $sFichDetino = $sNombre;

        if ( ! $fDestino = fopen ($sFichDetino, "wb"))
            return false;
        fwrite($fDestino, $sDesBin);
        fclose($fDestino);

        return true;
        
    }
    
    // Ejemplo:
    if (iDescomprimir ("directorio_fichero/archivo_origen.xxx.gz"))
    {
        echo "Fichero descomprimido satisfactoriamente !!!";
    }else{
        echo "Se ha producido un error en la descompresión del fichero.<br>";
        echo "Asegúrese de que la ruta del fichero a descomprimir es valida y tiene permisos de escritura / lectura";
    }
    
?>

Links relacionados:
Compresión de ficheros con PHP a GZIP
Cambiar tamaño y peso de imágenes
Recorrer directorio para tratar su contenido
Forzar descarga de ficheros en lado cliente
Imprimir archivo directamente desde el servidor en impresora de red


Para cualquier duda, consulta, sugerencia, opinión, colaboración, etc; no dude en ponerse en contacto con nosotros

Copyright © 2002-2017 [McAnam]. Reservados todos los derechos.
www.mcanam.com