Zip Class Problems

PHP programming forum. Ask questions or help people concerning PHP code. Don't understand a function? Need help implementing a class? Don't understand a class? Here is where to ask. Remember to do your homework!

Moderator: General Moderators

Post Reply
User avatar
Joe
Forum Regular
Posts: 939
Joined: Sun Feb 29, 2004 1:26 pm
Location: UK - Glasgow

Zip Class Problems

Post by Joe »

I have finally made up a zip class (thanks to Zend) but I seem to have a problem with zipping files/directories. The class goes like:

Code: Select all

<?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;

function add_dir($name)
{
  $name = str_replace("", "/", $name);

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

  $fr .= pack("V",0); 
  $fr .= pack("V",0); 
  $fr .= pack("V",0); 
  $fr .= pack("v", strlen($name) ); 
  $fr .= pack("v", 0 ); 
  $fr .= $name; 
  $fr .= pack("V", 0); 
  $fr .= pack("V", 0); 
  $fr .= pack("V", 0); 

  $this -> datasec[] = $fr;

  $new_offset = strlen(implode("", $this->datasec)); 

  $cdrec = "\x50\x4b\x01\x02"; 
  $cdrec .="\x00\x00"; 
  $cdrec .="\x0a\x00"; 
  $cdrec .="\x00\x00"; 
  $cdrec .="\x00\x00"; 
  $cdrec .="\x00\x00\x00\x00"; 
  $cdrec .= pack("V",0); 
  $cdrec .= pack("V",0); 
  $cdrec .= pack("V",0); 
  $cdrec .= pack("v", strlen($name) ); 
  $cdrec .= pack("v", 0 ); 
  $cdrec .= pack("v", 0 ); 
  $cdrec .= pack("v", 0 ); 
  $cdrec .= pack("v", 0 ); 
  $ext = "\x00\x00\x10\x00"; 
  $ext = "\xff\xff\xff\xff"; 
  $cdrec .= pack("V", 16 ); 
  $cdrec .= pack("V", $this -> old_offset ); 
  $cdrec .= $name; 

  $this -> ctrl_dir[] = $cdrec; 
  $this -> old_offset = $new_offset; 
  return; 
} 

function add_file($data, $name) 
{ 
  $name = str_replace("", "/", $name); 
  $unc_len = strlen($data); 
  $crc = crc32($data); 
  $zdata = gzcompress($data); 
  $zdate = substr ($zdata, 2, -4); 
  $c_len = strlen($zdata); 
 
  $fr = "\x50\x4b\x03\x04"; 
  $fr .= "\x14\x00"; 
  $fr .= "\x00\x00"; 
  $fr .= "\x08\x00"; 
  $fr .= "\x00\x00\x00\x00"; 
  $fr .= pack("V",$crc); 
  $fr .= pack("V",$c_len); 
  $fr .= pack("V",$unc_len); 
  $fr .= pack("v", strlen($name) ); 
  $fr .= pack("v", 0 ); 
  $fr .= $name; 
  $fr .= $zdata; 
  $fr .= pack("V",$crc); 
  $fr .= pack("V",$c_len); 
  $fr .= pack("V",$unc_len); 

  $this -> datasec[] = $fr; 

  $new_offset = strlen(implode("", $this->datasec)); 

  $cdrec = "\x50\x4b\x01\x02"; 
  $cdrec .="\x00\x00"; 
  $cdrec .="\x14\x00"; 
  $cdrec .="\x00\x00"; 
  $cdrec .="\x08\x00"; 
  $cdrec .="\x00\x00\x00\x00"; 
  $cdrec .= pack("V",$crc); 
  $cdrec .= pack("V",$c_len); 
  $cdrec .= pack("V",$unc_len); 
  $cdrec .= pack("v", strlen($name) ); 
  $cdrec .= pack("v", 0 ); 
  $cdrec .= pack("v", 0 ); 
  $cdrec .= pack("v", 0 ); 
  $cdrec .= pack("v", 0 ); 
  $cdrec .= pack("V", 32 ); 
  $cdrec .= pack("V", $this -> old_offset ); 

  $this -> old_offset = $new_offset; 

  $cdrec .= $name; 
  $this -> ctrl_dir[] = $cdrec; 
} 

function file() 
{ 
  $data = implode("", $this -> datasec); 
  $ctrldir = implode("", $this -> ctrl_dir); 

 return 
  $data. 
  $ctrldir. 
  $this -> eof_ctrl_dir. 
  pack("v", sizeof($this -> ctrl_dir)). 
  pack("v", sizeof($this -> ctrl_dir)). 
  pack("V", strlen($ctrldir)). 
  pack("V", strlen($data)). 
  "\x00\x00"; 
 } 
}
?>
Which all works well but when I try to zip a file/directory I get nothing but an empty zip file. The code I use to build the zip goes like:

Code: Select all

<?php
$dump_buffer = "../tester";
if (@function_exists('gzcompress')) 
{
 $zipfile = new zipfile();
 $zipfile -> add_dir($dump_buffer);
 $dump_buffer = $zipfile -> file();

 Header ('Content-type: application/octet-stream');
 Header ('Content-disposition: attachment; filename="'.$dump_buffer.'.zip"');
}
?>
Can anyone spot anything that I am missing here?.


Thanks


Joe 8)
User avatar
Joe
Forum Regular
Posts: 939
Joined: Sun Feb 29, 2004 1:26 pm
Location: UK - Glasgow

Post by Joe »

No worry's. I managed to work it out. I simply created a new function which reads and writes all of the directory contents to the zip file. Thanks anyway!.
User avatar
Christopher
Site Administrator
Posts: 13596
Joined: Wed Aug 25, 2004 7:54 pm
Location: New York, NY, US

Post by Christopher »

Please post the code. It looks interesting.
Post Reply