Foros del Web » Programando para Internet » PHP »

Upload y Compreción?

Estas en el tema de Upload y Compreción? en el foro de PHP en Foros del Web. Hola gente. tengo una duda. Estoy armando una biblioteca en donde los usuarios podrán subir archivos a la misma para que se los pueda descargar. ...
  #1 (permalink)  
Antiguo 21/10/2007, 10:46
 
Fecha de Ingreso: junio-2007
Mensajes: 76
Antigüedad: 16 años, 10 meses
Puntos: 1
Upload y Compreción?

Hola gente. tengo una duda. Estoy armando una biblioteca en donde los usuarios podrán subir archivos a la misma para que se los pueda descargar. Me gustaria que estos archivos se comprimieran por ejemplo en rar o zip al mismo tiempo que se hace el upload, primero para que ocupen menor espacio y segundo para que el link los descargue y no los abra en el navegador, como podria pasar con un pdf.

¿Esto sera posible? Si alguien sabe como hacerlo desde ya agradezco los aportes. Si tienen algo de codigo para verlo mejor aun. Gracias.

Salud...
  #2 (permalink)  
Antiguo 21/10/2007, 14:05
Avatar de Seixas  
Fecha de Ingreso: mayo-2004
Ubicación: Barcelona
Mensajes: 60
Antigüedad: 19 años, 11 meses
Puntos: 0
Re: Upload y Compreción?

Si googleas un poco encontrarás algo así:

Comprimir archivos con PHP
  #3 (permalink)  
Antiguo 21/10/2007, 22:37
 
Fecha de Ingreso: junio-2007
Mensajes: 76
Antigüedad: 16 años, 10 meses
Puntos: 1
Re: Upload y Compreción?

Es verdad lo que decís, muchas veces uno puede googlear y encontrar cosas que sirven, pero así se pierden los aportes que puede hacer la gente que participa en el foro, y el foro tampoco se puede nutrir de esas inquietudes o dudas que uno que recién esta aprendiendo puede tener. En mi opinión la idea de la gente que participa en un foro es la de aportar conocimientos en al medida de lo posible y nutrirse del saber de otros. Y san google no puede dar eso.

De todas formas gracias por loq ue me pasastes, me sirvio.

Saludos
  #4 (permalink)  
Antiguo 22/10/2007, 01:28
Avatar de Marvin
Colaborador
 
Fecha de Ingreso: febrero-2005
Ubicación: global $Chile->Santiago;
Mensajes: 1.991
Antigüedad: 19 años, 2 meses
Puntos: 81
Re: Upload y Compreción?

Revisa este post:

http://www.forosdelweb.com/f18/crear-rar-525029/


Suerte!
__________________
El que dice "Solo sé que nada sé", esta asumiendo que sabe algo.
Lea las FAQ's!
  #5 (permalink)  
Antiguo 23/10/2007, 14:13
 
Fecha de Ingreso: junio-2007
Mensajes: 76
Antigüedad: 16 años, 10 meses
Puntos: 1
Re: Upload y Compreción?

Te agradezco Marvin. voy a echarle una buena mirada al sitio que pasas y tenerlo en cuenta parece interesante. De todas formas ya pude lograr lo que queria siguendo lo que me pasaba Seixas. Es muy sencillo, no tiene nada del otro mundo, en lugar de hacer el move_uploaded_file($HTTP_POST_FILES directamente se hace la comprecion y se mueve el archivo al directorio de destino. Dejo reseña de como lo hice por si a alguien ams le sirve, siempre es bueno ver algo de codigo y si a uno se lo dan mejor :P

Saludos...

ziparchive.php:
Código PHP:
<?php
/*
    ***** AlfaZoneSoft PHP program *****
    [program]
    Function or script name:
        Zip Library
    Project: 
        Xerowon
    Maked: 2005 September - 2006 May
    Wrote: 
        AlfaZonesoft, Szegedi Zoltán (Alias: Mágus, PHPMagus)
        Original: PHPMyAdmin (GNU)
        * http://www.pkware.com/business_and_developers/developer/popups/appnote.txt - .ZIP File Format Specification
    [accessible]
    E-mail: 
        [email protected][email protected][email protected]
    Website: 
        http://alfazonesoft.ath.cx
    MSN: 
        [email protected]
    ***** AlfaZoneSoft PHP program *****
*/

class zipArchive  {  
    var 
$compressedData = array(); 
    var 
$centralDirectory = array();
    var 
$endOfCentralDirectory "\x50\x4b\x05\x06\x00\x00\x00\x00";
    var 
$oldOffset 0;

    function 
addDir($directoryName) {
        
$directoryName str_replace("\\""/"$directoryName);  

        
$feedArrayRow "\x50\x4b\x03\x04";
        
$feedArrayRow .= "\x0a\x00";    
        
$feedArrayRow .= "\x00\x00";    
        
$feedArrayRow .= "\x00\x00";    
        
$feedArrayRow .= "\x00\x00\x00\x00"

        
$feedArrayRow .= pack("V",0); 
        
$feedArrayRow .= pack("V",0); 
        
$feedArrayRow .= pack("V",0); 
        
$feedArrayRow .= pack("v"strlen($directoryName) ); 
        
$feedArrayRow .= pack("v"); 
        
$feedArrayRow .= $directoryName;  

        
$feedArrayRow .= pack("V",0); 
        
$feedArrayRow .= pack("V",0); 
        
$feedArrayRow .= pack("V",0); 

        
$this -> compressedData[] = $feedArrayRow;
        
        
$newOffset strlen(implode(""$this->compressedData));

        
$addCentralRecord "\x50\x4b\x01\x02";
        
$addCentralRecord .="\x00\x00";    
        
$addCentralRecord .="\x0a\x00";    
        
$addCentralRecord .="\x00\x00";    
        
$addCentralRecord .="\x00\x00";    
        
$addCentralRecord .="\x00\x00\x00\x00"
        
$addCentralRecord .= pack("V",0); 
        
$addCentralRecord .= pack("V",0); 
        
$addCentralRecord .= pack("V",0); 
        
$addCentralRecord .= pack("v"strlen($directoryName) ); 
        
$addCentralRecord .= pack("v"); 
        
$addCentralRecord .= pack("v"); 
        
$addCentralRecord .= pack("v"); 
        
$addCentralRecord .= pack("v"); 
        
$ext "\x00\x00\x10\x00";
        
$ext "\xff\xff\xff\xff";  
        
$addCentralRecord .= pack("V"16 ); 

        
$addCentralRecord .= pack("V"$this -> oldOffset ); 
        
$this -> oldOffset $newOffset;

        
$addCentralRecord .= $directoryName;  

        
$this -> centralDirectory[] = $addCentralRecord;  
    }     
    
    function 
addFile($filename$directoryName)   {
        
$data=file_get_contents($filename);
         
$directoryName str_replace("\\""/"$directoryName);  
    
        
$feedArrayRow "\x50\x4b\x03\x04";
        
$feedArrayRow .= "\x14\x00";    
        
$feedArrayRow .= "\x00\x00";    
        
$feedArrayRow .= "\x08\x00";    
        
$feedArrayRow .= "\x00\x00\x00\x00"

        
$uncompressedLength strlen($data);  
        
$compression crc32($data);  
        
$gzCompressedData gzcompress($data);  
        
$gzCompressedData substrsubstr($gzCompressedData0strlen($gzCompressedData) - 4), 2); 
        
$compressedLength strlen($gzCompressedData);  
        
$feedArrayRow .= pack("V",$compression); 
        
$feedArrayRow .= pack("V",$compressedLength); 
        
$feedArrayRow .= pack("V",$uncompressedLength); 
        
$feedArrayRow .= pack("v"strlen($directoryName) ); 
        
$feedArrayRow .= pack("v"); 
        
$feedArrayRow .= $directoryName;  

        
$feedArrayRow .= $gzCompressedData;  

        
$feedArrayRow .= pack("V",$compression); 
        
$feedArrayRow .= pack("V",$compressedLength); 
        
$feedArrayRow .= pack("V",$uncompressedLength); 

        
$this -> compressedData[] = $feedArrayRow;

        
$newOffset strlen(implode(""$this->compressedData));

        
$addCentralRecord "\x50\x4b\x01\x02";
        
$addCentralRecord .="\x00\x00";    
        
$addCentralRecord .="\x14\x00";    
        
$addCentralRecord .="\x00\x00";    
        
$addCentralRecord .="\x08\x00";    
        
$addCentralRecord .="\x00\x00\x00\x00"
        
$addCentralRecord .= pack("V",$compression); 
        
$addCentralRecord .= pack("V",$compressedLength); 
        
$addCentralRecord .= pack("V",$uncompressedLength); 
        
$addCentralRecord .= pack("v"strlen($directoryName) ); 
        
$addCentralRecord .= pack("v");
        
$addCentralRecord .= pack("v");
        
$addCentralRecord .= pack("v");
        
$addCentralRecord .= pack("v");
        
$addCentralRecord .= pack("V"32 ); 

        
$addCentralRecord .= pack("V"$this -> oldOffset ); 
        
$this -> oldOffset $newOffset;

        
$addCentralRecord .= $directoryName;  

        
$this -> centralDirectory[] = $addCentralRecord;  
    }

    function 
addAuthor() {
        
/*$fp = fopen("zip_author_deletefile.deletefie_author_zip","w");
        fwrite($fp, "UMVista 360\n");
        fwrite($fp, "\n");
        fwrite($fp, "Web: http://alfazonesoft.ath.cx\n\n");
        fwrite($fp, "A fájl elkészült: ".date("Y.m.d. H:i:s")."\n");
        fclose($fp);
        $this -> addFile("zip_author_deletefile.deletefie_author_zip","zipinfo.txt");
        unlink("zip_author_deletefile.deletefie_author_zip");*/
    
}

    function 
getZip() { 
        
$this -> addAuthor();
        
$data implode(""$this -> compressedData);  
        
$controlDirectory implode(""$this -> centralDirectory);  

        return   
            
$data.  
            
$controlDirectory.  
            
$this -> endOfCentralDirectory.  
            
pack("v"sizeof($this -> centralDirectory)).     
            
pack("v"sizeof($this -> centralDirectory)).     
            
pack("V"strlen($controlDirectory)).             
            
pack("V"strlen($data)).                
            
"\x00\x00";                             
    }
    function 
saveZip($filename) {
        
$fp fopen ($filename"wb");
        
fwrite ($fp$this -> getZip());
        
fclose ($fp);
    }
    
    function 
downloadZip($filename) {
        if(
ini_get('zlib.output_compression')) {
            
ini_set('zlib.output_compression''Off');
        }
        elseif ( ! 
file_exists$filename ) ) {
            echo 
"<html><title>Archivo no encontrado</title><body><b>Error::</b> El archivo no fue encontrado.</body></html>";
            exit;
        }

        
header("Pragma: public");
        
header("Expires: 0");
        
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        
header("Cache-Control: private",false);
        
header("Content-Type: application/zip");
        
header("Content-Disposition: attachment; filename=".basename($filename).";" );
        
header("Content-Transfer-Encoding: binary");
        
header("Content-Length: ".filesize($filename));
        
readfile("$filename");
        
     }
}
?>
En el archivo que procesa el upload instanciamos ziparchive.php

Luego antes de hacer la insercion en la base, en vez de hacer el move_uploaded_file($HTTP_POST_FILES creamos el archivo de la siguiente forma:

Código PHP:
//////////////////////////////////////
///////////////////////////////////////
$zip = new zipArchive(); 
$path $HTTP_POST_FILES['archivoup']['tmp_name'];
$name $HTTP_POST_FILES['archivoup']['name'];                  
//Anadimos el archivo a comprimir
$zip->addFile($path,$name);                 
$pathSave $movera $folder_destino "_" .$nombre_archivo".zip";
//Guargamos el archivo 
$zip->saveZip($pathSave);                 
//Si desaemos inmediatamente descargar el archivo compreso
//$zip->downloadZip($pathSave);    
/////////////////////////////////////// 
  #6 (permalink)  
Antiguo 17/07/2008, 09:31
Avatar de Seixas  
Fecha de Ingreso: mayo-2004
Ubicación: Barcelona
Mensajes: 60
Antigüedad: 19 años, 11 meses
Puntos: 0
Respuesta: Upload y Compreción?

Saludos,

otra posible solución es la librería ZipArchive de PHP. Es una extensión que viene incluida con PHP (versión 5 diría). Hay que tener la activa en el php.ini para poderla utilizar. En el enlace anterior hay un apartado con ejemplos para ver el funcionamiento.

He probado la classe comentada en este artículo, pero me ha dado problemas al comprimir imágenes.

Nota al moderador: he creído conveniente revivir este post porque servirá a todos aquellos que lo encuentren utilizando el buscador del foro.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 20:44.