PHP Class/function to dynamically create a zip file (archive)
Class: http://www.phpclasses.org/ browse/package/2322.html
<?PHP
/**
* Class to dynamically create a zip file (archive)
*
* @author Rochak Chauhan
*/
class createZip {
public $compressedData = array();
public $centralDirectory = array(); // central directory
public $endOfCentralDirectory = "\\x50\\x4b\\x05\\x06\\x00\\ x00\\x00\\x00" ; //end of Central directory record
public $oldOffset = 0 ;
/**
* Function to create the directory where the file(s) will be unzipped
*
* @param $directoryName string
*
*/
public 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
*
*/
public 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)
*/
public 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
*/
public 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=" . basenam e ( $archiveName ). ";" );
header ( "Content-Transfer- Encoding: binary" );
header ( "Content-Length: " . file size ( $archiveName ));
readfile ( "$archiveName" );
}
}
?> |