Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
PHP: zip_open - Manual
[go: Go Back, main page]

PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

zip_read" width="11" height="7"/> <zip_entry_read
Last updated: Fri, 13 Jun 2008

view this page in

zip_open

(PHP 4 >= 4.0.7, PHP 5 >= 5.2.0, PECL zip:1.0-1.9.0)

zip_open — Zip ファイルアーカイブをオープンする

説明

mixed zip_open ( string $filename )

読み込み用に新規に Zip アーカイブをオープンします。

パラメータ

filename

オープンする ZIP アーカイブのファイル名。

返り値

後で zip_read() および zip_close() で使用されるリソースハンドル、または、 filename が存在しない場合やその他のエラーが発生した場合は エラーの番号を返します。



zip_read" width="11" height="7"/> <zip_entry_read
Last updated: Fri, 13 Jun 2008
 
add a note add a note User Contributed Notes
zip_open
alban dot lopez+php dot net at gmail dot com
17-Nov-2007 08:13
See this class to make, read Infos or extract ZIP archive.
see EasyArchive.class.php on http://ajaxbrowser.free.fr/ to manage like that ZIP, GZIP, BZIP and TAR archive.

<?
$ARCHIVE
= new zip;

$ARCHIVE->makeZip('./','./toto.zip'); // make an ZIP archive
var_export($ARCHIVE->infosZip('./toto.zip'), false); // get infos of this ZIP archive (without files content)
var_export($ARCHIVE->infosZip('./toto.zip')); // get infos of this ZIP archive (with files content)
$ARCHIVE->extractZip('./toto.zip', './1/'); //

class zip
{
   
public function infosZip ($src, $data=true)
    {
        if ((
$zip = zip_open(realpath($src))))
        {
            while ((
$zip_entry = zip_read($zip)))
            {
               
$path = zip_entry_name($zip_entry);
                if (
zip_entry_open($zip, $zip_entry, "r"))
                {
                   
$content[$path] = array (
                       
'Ratio' => zip_entry_filesize($zip_entry) ? round(100-zip_entry_compressedsize($zip_entry) / zip_entry_filesize($zip_entry)*100, 1) : false,
                       
'Size' => zip_entry_compressedsize($zip_entry),
                       
'NormalSize' => zip_entry_filesize($zip_entry));
                    if (
$data)
                       
$content[$path]['Data'] = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
                   
zip_entry_close($zip_entry);
                }
                else
                   
$content[$path] = false;
            }
           
zip_close($zip);
            return
$content;
        }
        return
false;
    }
   
public function extractZip ($src, $dest)
    {
       
$zip = new ZipArchive;
        if (
$zip->open($src)===true)
        {
           
$zip->extractTo($dest);
           
$zip->close();
            return
true;
        }
        return
false;
    }
   
public function makeZip ($src, $dest)
    {
       
$zip = new ZipArchive;
       
$src = is_array($src) ? $src : array($src);
        if (
$zip->open($dest, ZipArchive::CREATE) === true)
        {
            foreach (
$src as $item)
                if (
file_exists($item))
                   
$this->addZipItem($zip, realpath(dirname($item)).'/', realpath($item).'/');
           
$zip->close();
            return
true;
        }
        return
false;
    }
   
private function addZipItem ($zip, $racine, $dir)
    {
        if (
is_dir($dir))
        {
           
$zip->addEmptyDir(str_replace($racine, '', $dir));
           
$lst = scandir($dir);
               
array_shift($lst);
               
array_shift($lst);
            foreach (
$lst as $item)
               
$this->addZipItem($zip, $racine, $dir.$item.(is_dir($dir.$item)?'/':''));
        }
        elseif (
is_file($dir))
           
$zip->addFile($dir, str_replace($racine, '', $dir));
    }
}
?>
flominator at gmx dot net
01-Aug-2007 10:49
@bisqwit at iki dot fi: If you're using older versions of PHP this skript might only read the first 8192 bytes. Great thing, anyway!
saulius at solmetra dot lt
19-Jun-2007 12:28
Some older PHP versions used to return false if zip_open failed, and newer versions return the number of error (as integer), so instead of this:

$zip = zip_open($zip_file);
if ($zip) {
  // consider zip file opened successfully
}

use this:

$zip = zip_open($zip_file);
if (is_resource($zip)) {
  // consider zip file opened successfully
}

You may also use this function to get the error message by it's number:

function zipFileErrMsg($errno) {
  // using constant name as a string to make this function PHP4 compatible
  $zipFileFunctionsErrors = array(
    'ZIPARCHIVE::ER_MULTIDISK' => 'Multi-disk zip archives not supported.',
    'ZIPARCHIVE::ER_RENAME' => 'Renaming temporary file failed.',
    'ZIPARCHIVE::ER_CLOSE' => 'Closing zip archive failed',
    'ZIPARCHIVE::ER_SEEK' => 'Seek error',
    'ZIPARCHIVE::ER_READ' => 'Read error',
    'ZIPARCHIVE::ER_WRITE' => 'Write error',
    'ZIPARCHIVE::ER_CRC' => 'CRC error',
    'ZIPARCHIVE::ER_ZIPCLOSED' => 'Containing zip archive was closed',
    'ZIPARCHIVE::ER_NOENT' => 'No such file.',
    'ZIPARCHIVE::ER_EXISTS' => 'File already exists',
    'ZIPARCHIVE::ER_OPEN' => 'Can\'t open file',
    'ZIPARCHIVE::ER_TMPOPEN' => 'Failure to create temporary file.',
    'ZIPARCHIVE::ER_ZLIB' => 'Zlib error',
    'ZIPARCHIVE::ER_MEMORY' => 'Memory allocation failure',
    'ZIPARCHIVE::ER_CHANGED' => 'Entry has been changed',
    'ZIPARCHIVE::ER_COMPNOTSUPP' => 'Compression method not supported.',
    'ZIPARCHIVE::ER_EOF' => 'Premature EOF',
    'ZIPARCHIVE::ER_INVAL' => 'Invalid argument',
    'ZIPARCHIVE::ER_NOZIP' => 'Not a zip archive',
    'ZIPARCHIVE::ER_INTERNAL' => 'Internal error',
    'ZIPARCHIVE::ER_INCONS' => 'Zip archive inconsistent',
    'ZIPARCHIVE::ER_REMOVE' => 'Can\'t remove file',
    'ZIPARCHIVE::ER_DELETED' => 'Entry has been deleted',
  );
  $errmsg = 'unknown';
  foreach ($zipFileFunctionsErrors as $constName => $errorMessage) {
    if (defined($constName) and constant($constName) === $errno) {
      return 'Zip File Function error: '.$errorMessage;
    }
  }
  return 'Zip File Function error: unknown';
}

$zip = zip_open($zip_file);
if (!is_resource($zip)) {
  die(zipFileErrMsg($zip));
}
Michael
09-Jun-2006 05:55
I tried the replacement hack above on Windows2k, here
are some fixes needed:
replace:
  return "'".str_replace("'", "'\''", $s)."'";
with:
  return '"'.str_replace("'", "'\''", $s).'"';

replace:
if($line[0]=='-') { $ok=!$ok; continue; }
with:
if($line[2]=='-') { $ok=!$ok; continue; }

replace:
 $contents[] = Array('name' => $fn, 'length' => $length);
with:
   array_push($contents, Array('name' => $fn, 'length' => $length));
ponsho
14-Dec-2005 05:44
For bisqwit at iki dot fi solution of alternative functions there's just one problem when trying to read the file thats because some bug in fread when handling from popen so it just load 8192 bytes here's the function corrected.

<?php

   
function zip_entry_read(&$res, $nbytes)
    {
     while (
$s = fgets($res['fp'],1024)) {
    
$data  .= $s;
     }
      return
$data;
    }
?>
barbarinasv at interfree dot it
05-Oct-2005 05:02
Function zip_entry_read() written by "bisqwit at iki dot fi" has to be modified to read entire files:

<?php
function zip_entry_read(&$res, $nbytes) {
    while (!
feof($res['fp'])) {
       
$contents .= fread($res['fp'], $nbytes);
    }
    return
$contents;
}
?>
robert at cotran dot ca
22-Sep-2005 04:19
The zip_entry_read above is wrong.  Since the file was opened with popen, you have to read the file in chunks, so zip_entry_read should read:

function zip_entry_read(&$res, $nbytes)
{
    $contents = '';
    while (!feof($res['fp'])) {
        $contents .= fread($res['fp'], 8192);
    }
    return $contents;
}

Otherwise, it was a very useful library.  Thanks!
bisqwit at iki dot fi
02-Sep-2005 08:08
If your PHP installation does not have the zip_open function, and you can't install it for whatever reason, you can use these functions instead, if the server has access to the "unzip" utility (most Linux systems do).
So far I have tested these only in Fedora Core 3.
Use at your own risk.

<?php

function ShellFix($s)
{
  return
"'".str_replace("'", "'\''", $s)."'";
}

function
zip_open($s)
{
 
$fp = @fopen($s, 'rb');
  if(!
$fp) return false;
 
 
$lines = Array();
 
$cmd = 'unzip -v '.shellfix($s);
 
exec($cmd, $lines);
 
 
$contents = Array();
 
$ok=false;
  foreach(
$lines as $line
  {
    if(
$line[0]=='-') { $ok=!$ok; continue; }
    if(!
$ok) continue;
   
   
$length = (int)$line;
   
$fn = trim(substr($line,58));
   
   
$contents[] = Array('name' => $fn, 'length' => $length);
  }
 
  return
    Array(
'fp'       => $fp
         
'name'     => $s,
         
'contents' => $contents,
         
'pointer'  => -1);
}                          
function
zip_read(&$fp)
{
  if(!
$fp) return false;
 
 
$next = $fp['pointer'] + 1;
  if(
$next >= count($fp['contents'])) return false;
 
 
$fp['pointer'] = $next;
  return
$fp['contents'][$next];
}
function
zip_entry_name(&$res)
{
  if(!
$res) return false;
  return
$res['name'];
}                          
function
zip_entry_filesize(&$res)
{
  if(!
$res) return false;
  return
$res['length'];
}
function
zip_entry_open(&$fp, &$res)
{
  if(!
$res) return false;

 
$cmd = 'unzip -p '.shellfix($fp['name']).' '.shellfix($res['name']);
 
 
$res['fp'] = popen($cmd, 'r');
  return !!
$res['fp'];  
}
function
zip_entry_read(&$res, $nbytes)
{
  return
fread($res['fp'], $nbytes);
}
function
zip_entry_close(&$res)
{
 
fclose($res['fp']);
  unset(
$res['fp']);
}
function
zip_close(&$fp)
{
 
fclose($fp['fp']);
}
?>

zip_read" width="11" height="7"/> <zip_entry_read
Last updated: Fri, 13 Jun 2008
 
 
show source | credits | sitemap | contact | advertising | mirror sites