Jump to content

Zip Archive Class


ballouta

Recommended Posts

Hello

 

I was testing a script i found here: http://www.ibm.com/developerworks/opensource/library/os-php-v524/

 

I want to use the extract part:

 

<?php
$zip = new ZipArchive();
$filename = 'newzip.zip';

if ($zip->open($filename)!==TRUE) {
   exit("cannot open <$filename>\n");
}

print_r($zip);
var_dump($zip);

echo "<br><br>";
echo "The file " .$filename. " has the following files:\n <br>";

for ($i=0; $i<$zip->numFiles;$i++) {
   echo "index: $i\n";
   print_r($zip->statIndex($i));
   echo "<br>\n";
}

$zip->extractTo('./testdestination/');

$zip->close();
?>

 

But i am getting this Fatal error: Class 'ZipArchive' not found in /home/User/public_html/test.php on line 105!

 

Is this cass built in or I should define it somehow?

in both cases please help i am very beginner

 

thanks

Link to comment
Share on other sites

If you want to play with ZIPs and PHP have a look at this chunk of code it'll help with a lot of issues your faced with by using external classes.

 

  $createZip = new createZip();

  $fileName = 'YOURZIPNAME.zip';
  $createZip->addDirectory('DIRECTORYNAME');
  $createZip->forceDownload($fileName);
  @unlink($fileName);

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 get_files_from_folder($directory, $put_into) {
    if ($handle = opendir($directory)) {
      while (false !== ($file = readdir($handle))) {
        if (is_file($directory.$file)) {
          $fileContents = file_get_contents($directory.$file);
          $this->addFile($fileContents, $put_into.$file);
        } elseif ($file != '.' and $file != '..' and is_dir($directory.$file)) {
          $this->addDirectory($put_into.$file.'/');
          $this->get_files_from_folder($directory.$file.'/', $put_into.$file.'/');
        }
      }
    }
    closedir($handle);
  }
    
    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=".basename($archiveName).";" );
        header("Content-Transfer-Encoding: binary");
        header("Content-Length: ".filesize($archiveName));
        readfile("$archiveName");
        
     }

} 

 

The above class works for so many situations.

 

Link to comment
Share on other sites

Hello

 

i just made a test on this code, i noticed the following:

1. It deleted the zip file.

2. I didn't find the extracted file(s) in the specified directory.

3. i am getting strange characters on the page in the internet explorer.

 

note that i set these two lines:

 

$fileName = '/home/user/public_html/malek/imap.zip';

$createZip->addDirectory('/home/user/public_html/malek/Daouk');

 

the imap.zip exists before running the code.

 

Please help, it is difficult for me to recognize the problem.

Link to comment
Share on other sites

i changed the paths to:

 

  $fileName = 'imap.zip';

  $createZip->addDirectory('Daouk');

 

I uploaded the php page to the directory where the zip file exists.

 

Both the zip file and Daouk directory exist now.

 

I run the code online, the zip file disappeared and Daouk directory is empty

:(

Link to comment
Share on other sites

i changed the paths to:

 

  $fileName = 'imap.zip';

  $createZip->addDirectory('Daouk');

 

I uploaded the php page to the directory where the zip file exists.

 

Both the zip file and Daouk directory exist now.

 

I run the code online, the zip file disappeared and Daouk directory is empty

:(

 

I think your misunderstanding how it all works.

 

The class creates a new ZIP file (One that isn't there at first) and the line

 

$createZip->addDirectory('Daouk');

 

Adds a new directory inside of the created zip file.

 

Here is a breakdown of how it all works

 

$fileName = 'imap.zip';

$createZip->get_files_from_folder('Daouk',$fileName);

 

What the above does is takes all the files from the folder called Daouk on your webserver and puts it into the zip file which will be created (imap.zip).

 

If you don't want to place all the files inside a directory but instead only include certain files you can do this

 

$createZip->addFile($data,$directory_name);

 

What this does is takes $data and puts it inside of a directory in the ZIP file.

 

$createZip->addDirectory($directory_name);

 

Creates a new directory inside of the zip file

 

And

 

$createZip->forceDownload($archiveName);

 

This opens a download window so the user can download the file.

 

So lets say I want to create a zip file called test.zip and I wanted to place a folder in this zip file called FOLDER and in that folder I wanted to place a file called FILE.php then my code would look like this

 

$fileName = 'imap.zip';

$createZip->addDirectory('FOLDER');

$createZip->addFile('FILE.php','FOLDER');

$createZip->forceDownload($fileName);

 

I hope this helps you better understand the code flow a little more.

 

Link to comment
Share on other sites

it is now very clear, thanks for explanation.

But i really misunderstood the main functionity of this code.

 

what i want is ONLY to uncompress a zip file in a spdicifc directory on my web.

note that this file was detected by a script that recieves emails and copy only the attachment files to this directory. after recievinig the attachment, i want them to be uncompressed.

 

an email arrives to mail directory of a website ==> PHP script/pipe detects the attachment (always zip files) ==> copy them to Directory'malek' ==> Here I should uncompress them, read a file name to add it to a table i have.

 

thanks and i appreciate your care

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • 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.