Solved

PHP Function to unzip a zip file to a sub-directory

Posted on 2011-02-21
9
152 Views
Last Modified: 2013-11-30
I'm trying to extract the contents of a zip package to a specific folder and keep getting an error.  I know the .zip package is good as I can open in from other programs.  This is php 5.2 so I know ZipArchive class is bundled.  Help???
Private $extractDir = './IMG/';

Private function download_pics ($dl_link){
	$zip = new ZipArchive;
	echo ('<br/>Start d/l Function');
	if  ($zip->open('./Test.zip') === true){
	  echo ('<br/>Start 1st Zip');
	  $zip->extractTo($extractDir);
	  $zip->close();
	  } ELSE {
  	  die("<br/>There was a problem unpacking the website .ZIP archive.");
	  }
  echo ('<br/>End Zip Functions');
  }

Open in new window

0
Comment
Question by:Dean_Kletter
9 Comments
 
LVL 8

Expert Comment

by:ragnarok89
ID: 34945518
is the php_zip.dll extension uncommented in your php.ini?
0
 
LVL 5

Expert Comment

by:wmadrid1
ID: 34945619
Can you please post te PHP Error
0
 

Author Comment

by:Dean_Kletter
ID: 34946455
I searched my php.ini and could not find a reference to php_zip.dll,  there was a mention of zlib but that appeared to be for uploading files.

I added:

extension=php_zip.dll

Still getting error, do I need to reboot?  Let IIS sit for 30 minute but did not restart services.

I have Error logging set to on and production level put nothing appeared but the error built into the code.
0
Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
LVL 5

Expert Comment

by:wmadrid1
ID: 34946571
You need to restart the IIS,

You can verify the ZI functions are loaded, creating a file with
<?
echo phpinfo();
?>

And run it from internet explorer,
This show a list, with the status of PHP
and all the loaded plugins, here must be the ZIP libraries showed
0
 

Author Comment

by:Dean_Kletter
ID: 34946971
It says it is enabled

 screen shot of phpinfo
0
 
LVL 5

Accepted Solution

by:
wmadrid1 earned 500 total points
ID: 34947040
I worked with this function to extract without problems:

function extractZip( $zipFile = '', $dirFromZip = '' )
{
	define(DIRECTORY_SEPARATOR, '/');    
	$zipDir = getcwd().DIRECTORY_SEPARATOR;
	$zip = zip_open($zipDir.$zipFile);    
	$zipDir = getcwd().DIRECTORY_SEPARATOR;
	if ($zip)    
	{        
		while ($zip_entry = zip_read($zip))        
		{            
			$completePath = $zipDir . dirname(zip_entry_name($zip_entry));            
			$completeName = $zipDir . zip_entry_name($zip_entry);            
			// Walk through path to create non existing directories            
			// This won't apply to empty directories ! They are created further below            
			if(!file_exists($completePath) && preg_match( '#^' . $dirFromZip .'.*#', dirname(zip_entry_name($zip_entry)) ) )            
			{                
				$tmp = '';                
				foreach(explode('/',$completePath) AS $k)                
				{                    
					$tmp .= $k.'/';                    
					if(!file_exists($tmp) )                    
					{                        
						mkdir($tmp, 0777);                    
					}                
				}            
			}            
			if (zip_entry_open($zip, $zip_entry, "r"))            
			{
				if( preg_match( '#^' . $dirFromZip .'.*#', dirname(zip_entry_name($zip_entry)) ) )                
				{                    
					if ($fd = fopen($completeName, 'w+'))                    
					{                        
						fwrite($fd, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)));                        
						fclose($fd);                    
					}                    
					else                    
					{                        
						// We think this was an empty directory                        
						mkdir($completeName, 0777);                    
					}                    
					zip_entry_close($zip_entry);                
				}            
			}        
		}        
		zip_close($zip);    
	}    
	return true;
}

Open in new window

0
 

Author Comment

by:Dean_Kletter
ID: 34952891
That is nice.  I don't need to enumerate through the ZIP file, just expand the contents to a folder.  The code below is directly off the PHP Website but still the ZIP file fails verification somehow.  I know the zip is valid, as I can open in numerous archiving application but it still fails the boolean test.
<?php
$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {
    $zip->extractTo('/my/destination/dir/');
    $zip->close();
    echo 'ok';
} else {
    echo 'failed';
}
?>

Open in new window

0
 
LVL 16

Expert Comment

by:CWS (haripriya)
ID: 39686708
This question has been classified as abandoned and is closed as part of the Cleanup Program. See the recommendation for more details.
0

Featured Post

Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Deprecated and Headed for the Dustbin By now, you have probably heard that some PHP features, while convenient, can also cause PHP security problems.  This article discusses one of those, called register_globals.  It is a thing you do not want.  …
3 proven steps to speed up Magento powered sites. The article focus is on optimizing time to first byte (TTFB), full page caching and configuring server for optimal performance.
The viewer will learn how to dynamically set the form action using jQuery.
The viewer will learn how to look for a specific file type in a local or remote server directory using PHP.

860 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question