Jump to content

creating zip files on the fly


subzerostudio

Recommended Posts

I am having trouble creating zip files on the fly using PHP.  I can zip one file (about 5mb), however when i try and zip two files together (about 12mb) I get the following error in firefox:

"The connection to the server was reset while the page was loading."

I guess it's timing out somewhere or something??  The code i'm using is given below.  I thought it could be something in the php.ini file but max_execution_time is set to 60secs and the error comes up way before that

Any ideas ??

Mike

[code]
<?php

/**
* Class to dynamically create a zip file (archive)
*
* @author Rochak Chauhan
*/

class createZip  { 

    var $compressedData = array();
    var $centralDirectory = array(); // central directory 
    var $endOfCentralDirectory = "\x50\x4b\x05\x06\x00\x00\x00\x00"; //end of Central directory record
    var $oldOffset = 0;

    /**
    * Function to create the directory where the file(s) will be unzipped
    *
    * @param $directoryName string
    *
    */
   
    function addDirectory($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", 0 );
        $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", 0 );
        $addCentralRecord .= pack("v", 0 );
        $addCentralRecord .= pack("v", 0 );
        $addCentralRecord .= pack("v", 0 );
        $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 to add file(s) to the specified directory in the archive
    *
    * @param $directoryName string
    *
    */
   
    function addFile($data, $directoryName)  {

        $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 = substr( substr($gzCompressedData, 0, strlen($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", 0 );
        $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", 0 );
        $addCentralRecord .= pack("v", 0 );
        $addCentralRecord .= pack("v", 0 );
        $addCentralRecord .= pack("v", 0 );
        $addCentralRecord .= pack("V", 32 );

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

        $addCentralRecord .= $directoryName; 

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

    /**
    * Fucntion to return the zip file
    *
    * @return zipfile (archive)
    */

    function getZippedfile() {

        $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 to force the download of the archive as soon as it is created
    *
    * @param archiveName string - name of the created archive file
    */

    function forceDownload($archiveName) {
        $headerInfo = '';
       
        if(ini_get('zlib.output_compression')) {
            ini_set('zlib.output_compression', 'Off');
        }

        // Security checks
        if( $archiveName == "" ) {
            echo "<html><title>Public Photo Directory - Download </title><body><BR><B>ERROR:</B> The download file was NOT SPECIFIED.</body></html>";
            exit;
        }
        elseif ( ! file_exists( $archiveName ) ) {
            echo "<html><title>Public Photo Directory - Download </title><body><BR><B>ERROR:</B> File not found.</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($archiveName).";" );
        header("Content-Transfer-Encoding: binary");
        header("Content-Length: ".filesize($archiveName));
        readfile("$archiveName");
       
    }

}
?>
[/code]


The code to create the zip using the above class:
[code]
<?php

include_once("createZip.php");
$createZip = new createZip; 


$fileContents = file_get_contents("test/a.mp3"); 
$createZip -> addFile($fileContents, "a.mp3"); 

$fileContents = file_get_contents("test/b.mp3");
$createZip -> addFile($fileContents, "b.mp3"); 

$fileContents = file_get_contents("test/c.mp3"); 
$createZip -> addFile($fileContents, "c.mp3"); 



$fileName = "test/archive.zip";
$fd = fopen ($fileName, "wb");
$out = fwrite ($fd, $createZip -> getZippedfile());
fclose ($fd);

?>

[/code]
Link to comment
https://forums.phpfreaks.com/topic/28579-creating-zip-files-on-the-fly/
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.