ballouta Posted May 23, 2008 Share Posted May 23, 2008 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 Quote Link to comment https://forums.phpfreaks.com/topic/106988-zip-archive-class/ Share on other sites More sharing options...
jonsjava Posted May 23, 2008 Share Posted May 23, 2008 you need to include the ZipArchive class in the file, or link to the file that contains it. Quote Link to comment https://forums.phpfreaks.com/topic/106988-zip-archive-class/#findComment-548387 Share on other sites More sharing options...
ballouta Posted May 23, 2008 Author Share Posted May 23, 2008 would you please write this class code for me if it is easy or tell me how i can fix it? thanks Quote Link to comment https://forums.phpfreaks.com/topic/106988-zip-archive-class/#findComment-548391 Share on other sites More sharing options...
jonsjava Posted May 23, 2008 Share Posted May 23, 2008 um...just realized. that's a PHP 5 library. You'll need PHP 5.2 or higher to use that. Quote Link to comment https://forums.phpfreaks.com/topic/106988-zip-archive-class/#findComment-548420 Share on other sites More sharing options...
ballouta Posted May 24, 2008 Author Share Posted May 24, 2008 hi again i just checked mu cpanel, they menione that i have PHP v. 5.2.5 (PHP version 5.2.5 ) then what's the problem? Please help, thanks alot Quote Link to comment https://forums.phpfreaks.com/topic/106988-zip-archive-class/#findComment-548715 Share on other sites More sharing options...
minidak03 Posted May 24, 2008 Share Posted May 24, 2008 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. Quote Link to comment https://forums.phpfreaks.com/topic/106988-zip-archive-class/#findComment-548718 Share on other sites More sharing options...
ballouta Posted May 24, 2008 Author Share Posted May 24, 2008 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. Quote Link to comment https://forums.phpfreaks.com/topic/106988-zip-archive-class/#findComment-548736 Share on other sites More sharing options...
minidak03 Posted May 24, 2008 Share Posted May 24, 2008 Don't try to use absolute urls use things like '../directory' or put it in the same folder where the zip is going to be. I think there was an issue with this before. Quote Link to comment https://forums.phpfreaks.com/topic/106988-zip-archive-class/#findComment-548743 Share on other sites More sharing options...
ballouta Posted May 24, 2008 Author Share Posted May 24, 2008 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 Quote Link to comment https://forums.phpfreaks.com/topic/106988-zip-archive-class/#findComment-548747 Share on other sites More sharing options...
minidak03 Posted May 24, 2008 Share Posted May 24, 2008 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. Quote Link to comment https://forums.phpfreaks.com/topic/106988-zip-archive-class/#findComment-548753 Share on other sites More sharing options...
ballouta Posted May 24, 2008 Author Share Posted May 24, 2008 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 Quote Link to comment https://forums.phpfreaks.com/topic/106988-zip-archive-class/#findComment-548759 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.