Log in

View Full Version : Php with Zip file Problem



rsmaha
02-11-2010, 05:53 AM
I am using the the following code to download files from server.




<?php



// Class definition found at http://www.zend.com/zend/spotlight/creating-zip-files3.php

// Some alterations to the original posted code were made in order to get everything working properly

// See example usage at the bottom of this page



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) {

$fp = fopen($data,"r");

$data = fread($fp,filesize($data));

fclose($fp);

$name = str_replace("", "/", $name);

$unc_len = strlen($data);

$crc = crc32($data);

$zdata = gzcompress($data);

$zdata = 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";

}

}



// Test this class

$zipTest = new zipfile();

$zipTest->add_dir("thumnails/");

$file="Sample.wma";

$zipTest->add_file("sample/".$file,"images/sample.wma");

$zipTest->add_file("images/2.jpg", "images/2.jpg");



// Return Zip File to Browser

Header("Content-type: application/octet-stream");

Header ("Content-disposition: attachment; filename=zipTest.zip");

echo $zipTest->file();

?>




Its working nice. But I am facing 2 problem with this code
1.While im downloading from localhost , Download ll be stopped after 25 MB
2.While im downloading from server , Download ll be stopped after 7.2MB

Some One knows it Please clarify ...