Foros del Web » Programando para Internet » PHP »

Como zipear con PHP?

Estas en el tema de Como zipear con PHP? en el foro de PHP en Foros del Web. Como se hace para meter dentro de un zip un archivo subido mediante Php?, es decir, que se genere el zip y el archivo dentro ...
  #1 (permalink)  
Antiguo 26/04/2005, 12:23
Avatar de antihem  
Fecha de Ingreso: mayo-2004
Ubicación: México
Mensajes: 227
Antigüedad: 13 años, 7 meses
Puntos: 0
Como zipear con PHP?

Como se hace para meter dentro de un zip un archivo subido mediante Php?, es decir, que se genere el zip y el archivo dentro de el.
__________________
- -
:neurotico eso fue un php warning ?
creo q si... :golpeado:
  #2 (permalink)  
Antiguo 26/04/2005, 12:47
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 13 años
Puntos: 34
Yo uso zip.lib...la saque de phpmyadmin una vez, y no se donde la tengo como para pasartela. Igual, de estas clases hay muchas, preguntale a google, segurmente te responda mejor que yo.
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #3 (permalink)  
Antiguo 04/05/2005, 11:48
Avatar de antihem  
Fecha de Ingreso: mayo-2004
Ubicación: México
Mensajes: 227
Antigüedad: 13 años, 7 meses
Puntos: 0
Bueno, pues encontre esta libreria zip.lib:
http://www.koders.com/php/fidD3BCF0D...E13DF2453.aspx

pero no se como usarle jaja.
__________________
- -
:neurotico eso fue un php warning ?
creo q si... :golpeado:
  #4 (permalink)  
Antiguo 04/05/2005, 13:42
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 13 años
Puntos: 34
Te paso la clase que yo usé, esta de más decir que fue extraida de phpmyadmin. La clase es esta:

Código PHP:
<?php
/* $Id: zip.lib.php,v 2.2 2004/04/27 12:36:11 nijel Exp $ */
// vim: expandtab sw=4 ts=4 sts=4:



/**
 * Zip file creation class.
 * Makes zip files.
 *
 * Based on :
 *
 *  http://www.zend.com/codex.php?id=535&single=1
 *  By Eric Mueller <[email protected]>
 *
 *  http://www.zend.com/codex.php?id=470&single=1
 *  by Denis125 <[email protected]>
 *
 *  a patch from Peter Listiak <[email protected]> for last modified
 *  date and time of the compressed file
 *
 * Official ZIP file format: http://www.pkware.com/appnote.txt
 *
 * @access  public
 */
class zipfile
{
    
/**
     * Array to store compressed data
     *
     * @var  array    $datasec
     */
    
private $datasec  = array();

    
/**
     * Central directory
     *
     * @var  array    $ctrl_dir
     */
    
private $ctrl_dir     = array();

    
/**
     * End of central directory record
     *
     * @var  string   $eof_ctrl_dir
     */
    
private $eof_ctrl_dir "\x50\x4b\x05\x06\x00\x00\x00\x00";

    
/**
     * Last offset position
     *
     * @var  integer  $old_offset
     */
    
private $old_offset   0;


    
/**
     * Converts an Unix timestamp to a four byte DOS date and time format (date
     * in high two bytes, time in low two bytes allowing magnitude comparison).
     *
     * @param  integer  the current Unix timestamp
     *
     * @return integer  the current date in a four byte DOS format
     *
     * @access private
     */
    
function unix2DosTime($unixtime 0) {
        
$timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);

        if (
$timearray['year'] < 1980) {
            
$timearray['year']    = 1980;
            
$timearray['mon']     = 1;
            
$timearray['mday']    = 1;
            
$timearray['hours']   = 0;
            
$timearray['minutes'] = 0;
            
$timearray['seconds'] = 0;
        } 
// end if


        
return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
                (
$timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
    } 
// end of the 'unix2DosTime()' method



    /**
     * Adds "file" to archive
     *
     * @param  string   file contents
     * @param  string   name of the file in the archive (may contains the path)
     * @param  integer  the current timestamp
     *
     * @access public
     */
    
function addFile($data$name$time 0)
    {
        
$name     str_replace('\\''/'$name);

        
$dtime    dechex($this->unix2DosTime($time));
        
$hexdtime '\x' $dtime[6] . $dtime[7]
                  . 
'\x' $dtime[4] . $dtime[5]
                  . 
'\x' $dtime[2] . $dtime[3]
                  . 
'\x' $dtime[0] . $dtime[1];
        eval(
'$hexdtime = "' $hexdtime '";');

        
$fr   "\x50\x4b\x03\x04";
        
$fr   .= "\x14\x00";            // ver needed to extract

        
$fr   .= "\x00\x00";            // gen purpose bit flag

        
$fr   .= "\x08\x00";            // compression method

        
$fr   .= $hexdtime;             // last mod time and date


        // "local file header" segment

        
$unc_len strlen($data);
        
$crc     crc32($data);
        
$zdata   gzcompress($data);
        
$zdata   substr(substr($zdata0strlen($zdata) - 4), 2); // fix crc bug

        
$c_len   strlen($zdata);
        
$fr      .= pack('V'$crc);             // crc32

        
$fr      .= pack('V'$c_len);           // compressed filesize

        
$fr      .= pack('V'$unc_len);         // uncompressed filesize

        
$fr      .= pack('v'strlen($name));    // length of filename

        
$fr      .= pack('v'0);                // extra field length

        
$fr      .= $name;

        
// "file data" segment

        
$fr .= $zdata;

        
// "data descriptor" segment (optional but necessary if archive is not

        // served as file)

        
$fr .= pack('V'$crc);                 // crc32

        
$fr .= pack('V'$c_len);               // compressed filesize

        
$fr .= pack('V'$unc_len);             // uncompressed filesize


        // add this entry to array

        
$this -> datasec[] = $fr;

        
// now add to central directory record

        
$cdrec "\x50\x4b\x01\x02";
        
$cdrec .= "\x00\x00";                // version made by

        
$cdrec .= "\x14\x00";                // version needed to extract

        
$cdrec .= "\x00\x00";                // gen purpose bit flag

        
$cdrec .= "\x08\x00";                // compression method

        
$cdrec .= $hexdtime;                 // last mod time & date

        
$cdrec .= pack('V'$crc);           // crc32

        
$cdrec .= pack('V'$c_len);         // compressed filesize

        
$cdrec .= pack('V'$unc_len);       // uncompressed filesize

        
$cdrec .= pack('v'strlen($name) ); // length of filename

        
$cdrec .= pack('v');             // extra field length

        
$cdrec .= pack('v');             // file comment length

        
$cdrec .= pack('v');             // disk number start

        
$cdrec .= pack('v');             // internal file attributes

        
$cdrec .= pack('V'32 );            // external file attributes - 'archive' bit set


        
$cdrec .= pack('V'$this -> old_offset ); // relative offset of local header

        
$this -> old_offset += strlen($fr);

        
$cdrec .= $name;

        
// optional extra field, file comment goes here

        // save to central directory

        
$this -> ctrl_dir[] = $cdrec;
    } 
// end of the 'addFile()' method



    /**
     * Dumps out file
     *
     * @return  string  the zipped file
     *
     * @access public
     */
    
function file()
    {
        
$data    implode(''$this -> datasec);
        
$ctrldir implode(''$this -> ctrl_dir);

        return
            
$data .
            
$ctrldir .
            
$this -> eof_ctrl_dir .
            
pack('v'sizeof($this -> ctrl_dir)) .  // total # of entries "on this disk"

            
pack('v'sizeof($this -> ctrl_dir)) .  // total # of entries overall

            
pack('V'strlen($ctrldir)) .           // size of central dir

            
pack('V'strlen($data)) .              // offset to start of central dir

            
"\x00\x00";                             // .zip file comment length

    
// end of the 'file()' method


// end of the 'zipfile' class

?>

Luego, la usas de la siguiente manera: (le he sacado todo lo que tenia de más, y no la he probado, pero teniendo el archivo anterior guardado como zip.lib.php, y un file en el mismo nivel llamado archivo.txt, deberia funcionar):

Código PHP:

require_once("zip.lib.php");
$file "archivo.txt";
$new_zip_file "Nombre_Algo.zip";
$ziper = new zipfile();
$ziper->addFile(file_get_contents($file),"Nombre_Algo.txt");
header("Content-Type: application/zip");
header("Content-Disposition: attachment; filename=".$new_zip_file);
echo 
$ziper->file(); 
Espero sirva, y si creen conveniente pasarlo a las Faqs, adelante.
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #5 (permalink)  
Antiguo 05/05/2005, 07:29
Avatar de antihem  
Fecha de Ingreso: mayo-2004
Ubicación: México
Mensajes: 227
Antigüedad: 13 años, 7 meses
Puntos: 0
Muchas Gracias nico!
__________________
- -
:neurotico eso fue un php warning ?
creo q si... :golpeado:
  #6 (permalink)  
Antiguo 18/05/2005, 23:51
 
Fecha de Ingreso: marzo-2003
Mensajes: 99
Antigüedad: 14 años, 9 meses
Puntos: 0
trate

Hola Chicos trate de hacer el archivo zip y la verdad pues todavia no me sale haber si me hechan la mano lo puse tal cual lo pone nico bueno solo le cambie

$ziper->addFile(file_get_contents($file),"Nombre_Algo.txt");
por Nombre_Algo.zip creo que esta bien asi, ustedes me dicen si no

pero me sale el error de que no puedo modificar el header bueno espero su ayuda y mil gracias aplaudo su ayuda
  #7 (permalink)  
Antiguo 19/05/2005, 00:06
 
Fecha de Ingreso: marzo-2003
Mensajes: 99
Antigüedad: 14 años, 9 meses
Puntos: 0
que creen?

que creen? pues que ya me salio !!!! de hecho no hay que cambiar el nombre como lo menciono antes, ahora me nace otra duda como puedo agregar mas de un archivo al zip, son bien benidas sus ideas gracias y que tengan buen dia
  #8 (permalink)  
Antiguo 19/05/2005, 02:31
Avatar de DINASEN  
Fecha de Ingreso: marzo-2003
Mensajes: 997
Antigüedad: 14 años, 9 meses
Puntos: 1
a mi me da este error

Parse error: parse error, expecting `T_OLD_FUNCTION' or `T_FUNCTION' or `T_VAR' or `'}'' in c:\appserv\www\zip\zip.lib.php on line 33

Un Saludo
  #9 (permalink)  
Antiguo 19/05/2005, 02:39
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 13 años, 4 meses
Puntos: 101
¿y por qué no muestras qué tienes en la línea 33???...
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #10 (permalink)  
Antiguo 19/05/2005, 02:42
Avatar de DINASEN  
Fecha de Ingreso: marzo-2003
Mensajes: 997
Antigüedad: 14 años, 9 meses
Puntos: 1
esta es la linea 33

private $datasec = array();

Un Saludo
  #11 (permalink)  
Antiguo 19/05/2005, 06:48
 
Fecha de Ingreso: marzo-2003
Mensajes: 99
Antigüedad: 14 años, 9 meses
Puntos: 0
te paso la clase que yo use busque en internet una que se llamara igual y me funciono y creo que aunque s ellama igual es diferente

<?php

class zipfile {

var $datasec = array();
var $ctrl_dir = array();
var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
var $old_offset = 0;
var $pathToFPDF = NULL;
var $pathToDeepDir = NULL;

function zipfile ($output_filename = 'archive.zip', $DeepDir = './DeepDir.php', $FPDF = './fpdf.php') {

header('Content-Type: application/x-zip');
header('Content-Disposition: inline; filename="' . $output_filename . '"');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');

$this->pathToFPDF = $FPDF;
$this->pathToDeepDir = $DeepDir;

}

function read_File ($file) {

if (is_file($file)) {

$fp = fopen ($file, 'rb');
$content = fread ($fp, filesize($file));
fclose ($fp);

return $content;

}

}

function replaceSuffix ($file, $suffix = 'pdf') {

$arr = explode('.', $file);
unset($arr[count($arr) - 1]);
$file = NULL;
foreach($arr as $v) $file .= $v . '.';
$file .= $suffix;

return $file;

}

function getDirContent ($dirName = './') {

if (is_dir($dirName)) {

if (include($this->pathToDeepDir)) {

$dir = new DeepDir();
$dir->setDir($dirName);
$dir->load();

return $dir->files;

} else {

if ($handle = opendir($dirName)) {

while (false !== ($file = readdir($handle))) {

if (($file != '.') && ($file != '..') && (is_file($file))) {

$content[] = $file;

}

}

closedir($handle);

return $content;

}

}

}

}

function addDirContent ($dir = './') {

foreach ($this->getDirContent($dir) as $input) {
$this->addFileAndRead(str_replace('.//', NULL, $input));
}

}

function addFileAndRead ($file) {

if (is_file($file))
$this->addFile($this->read_File($file), $file);

}

function addFileAsPDF ($file, $title = 'PDF File', $author = 'Anonymous') {
//You need FPDF to use this function!
//get it at http://www.fpdf.org/

if (include($this->pathToFPDF)) {

$pdf = new PDF();
$pdf->Open();

//edit this as you need it

$pdf->SetTitle($title);
$pdf->SetAuthor($author);
$pdf->PrintChapter(1, $author, $file);

//nothing to edit below!

$this->addFile($pdf->getBuffer(), $this->replaceSuffix($file));

} else {

$filecontent = implode(NULL, file($file));

$content .= '********************************************' . "\n";
$content .= '* *' . "\n";
$content .= '* Couldn\'t find FPDF! *' . "\n";
$content .= '* Adding this File as plain text file. *' . "\n";
$content .= '* *' . "\n";
$content .= '* Below this box is the sourcefile. *' . "\n";
$content .= '* *' . "\n";
$content .= '********************************************' . "\n";

$content .= ' ' . "\n";
$content .= ' ' . "\n";
$content .= ' ' . "\n";

$content .= $filecontent;

$this->addFile($content, $file);

}

}

function unix2DosTime($unixtime = 0) {

$timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);

if ($timearray['year'] < 1980) {

$timearray['year'] = 1980;
$timearray['mon'] = 1;
$timearray['mday'] = 1;
$timearray['hours'] = 0;
$timearray['minutes'] = 0;
$timearray['seconds'] = 0;

}

return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);

}

function addFile($data, $name, $time = 0) {

$name = str_replace('\\', '/', $name);

$dtime = dechex($this->unix2DosTime($time));
$hexdtime = '\x' . $dtime[6] . $dtime[7]
. '\x' . $dtime[4] . $dtime[5]
. '\x' . $dtime[2] . $dtime[3]
. '\x' . $dtime[0] . $dtime[1];

eval('$hexdtime = "' . $hexdtime . '";');

$fr = "\x50\x4b\x03\x04";
$fr .= "\x14\x00"; // ver needed to extract
$fr .= "\x00\x00"; // gen purpose bit flag
$fr .= "\x08\x00"; // compression method
$fr .= $hexdtime; // last mod time and date

// "local file header" segment
$unc_len = strlen($data);
$crc = crc32($data);
$zdata = gzcompress($data);
$zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
$c_len = strlen($zdata);
$fr .= pack('V', $crc); // crc32
$fr .= pack('V', $c_len); // compressed filesize
$fr .= pack('V', $unc_len); // uncompressed filesize
$fr .= pack('v', strlen($name)); // length of filename
$fr .= pack('v', 0); // extra field length
$fr .= $name;

// "file data" segment
$fr .= $zdata;

// "data descriptor" segment (optional but necessary if archive is not
// served as file)
$fr .= pack('V', $crc); // crc32
$fr .= pack('V', $c_len); // compressed filesize
$fr .= pack('V', $unc_len); // uncompressed filesize

// add this entry to array
$this -> datasec[] = $fr;
$new_offset = strlen(implode('', $this->datasec));

// now add to central directory record
$cdrec = "\x50\x4b\x01\x02";
$cdrec .= "\x00\x00"; // version made by
$cdrec .= "\x14\x00"; // version needed to extract
$cdrec .= "\x00\x00"; // gen purpose bit flag
$cdrec .= "\x08\x00"; // compression method
$cdrec .= $hexdtime; // last mod time & date
$cdrec .= pack('V', $crc); // crc32
$cdrec .= pack('V', $c_len); // compressed filesize
$cdrec .= pack('V', $unc_len); // uncompressed filesize
$cdrec .= pack('v', strlen($name) ); // length of filename
$cdrec .= pack('v', 0 ); // extra field length
$cdrec .= pack('v', 0 ); // file comment length
$cdrec .= pack('v', 0 ); // disk number start
$cdrec .= pack('v', 0 ); // internal file attributes
$cdrec .= pack('V', 32 ); // external file attributes - 'archive' bit set

$cdrec .= pack('V', $this -> old_offset ); // relative offset of local header
$this -> old_offset = $new_offset;

$cdrec .= $name;

// optional extra field, file comment goes here
// save to central directory
$this -> ctrl_dir[] = $cdrec;

}

function file() {

$data = implode(NULL, $this -> datasec);
$ctrldir = implode(NULL, $this -> ctrl_dir);

return $data .
$ctrldir .
$this -> eof_ctrl_dir .
pack('v', sizeof($this -> ctrl_dir)) . // total # of entries "on this disk"
pack('v', sizeof($this -> ctrl_dir)) . // total # of entries overall
pack('V', strlen($ctrldir)) . // size of central dir
pack('V', strlen($data)) . // offset to start of central dir
"\x00\x00"; // .zip file comment length
}

}

?>

bueno espero y te funcione y alguin que me ayude a agragar directorio completo a un archivo zip que no lo logro o varios archivos que hasta ahora solo puedo de uno ya intente con la funcion
function addDirContent ($dir = './') {
de la clase pero no lo hace no se que estoy haciendo mal bueno mil gracias
  #12 (permalink)  
Antiguo 19/05/2005, 11:01
hmv
 
Fecha de Ingreso: abril-2005
Mensajes: 311
Antigüedad: 12 años, 8 meses
Puntos: 0
Cita:
Iniciado por DINASEN
a mi me da este error

Parse error: parse error, expecting `T_OLD_FUNCTION' or `T_FUNCTION' or `T_VAR' or `'}'' in c:\appserv\www\zip\zip.lib.php on line 33

Un Saludo
Te sale ese error por la versión de php q usas. Esto solo funciona en php 5 y seguro q tu tienes una versión anterior.
  #13 (permalink)  
Antiguo 19/05/2005, 12:02
Avatar de DINASEN  
Fecha de Ingreso: marzo-2003
Mensajes: 997
Antigüedad: 14 años, 9 meses
Puntos: 1
Gracias hmv estas en lo correcto

solo me queda una duda como puedo hacer para que no se descargue el archivo zip sino que se guarde donde esta el archivo

Un Saludo
  #14 (permalink)  
Antiguo 19/05/2005, 12:07
 
Fecha de Ingreso: marzo-2003
Mensajes: 99
Antigüedad: 14 años, 9 meses
Puntos: 0
hola

Hola y no se les paso por ahi mi pregunta?
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.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 13:33.