Просмотр ZIP-архива

Простой просмотр zip-архивов. Вызывать: zip.php?arh=путь_к_файлу

// вспомогательная функция, выводит размер файла
function sizer($s){
$o=1;
while($s>1024){
   $s = round($s / 1024, 1);
   $o++;
   }
switch($o){
   case(1):
    $o='b'; break;
   case(2):
        $o='Kb';break;
   case(3):
        $o='Mb';break;
   case(4):
        $o='Gb';break;
   }
return $s.$o;
}


if(!empty($_GET['arh']))
   $arh = base64_decode($_GET['arh']);

if(!is_file($arh))
   die('Файла не существует!');

if(!empty($_GET['act']))
   $act = $_GET['act'];
else
   $act = 'main';

$zip = new ZipArchive;
if($zip->open ($arh) === TRUE){
   switch($act){
   case('main'):
    echo'Обьектов: '.$zip->numFiles.'<br/>';
    if($zip->comment != NULL)
       echo'Комментарий: '.$zip->comment.'<br/>';
    for ($i = 0; $i < $zip->numFiles; $i++) {
           $t = $zip-> statIndex($i);
           if(preg_match('/\/$/',$t['name']))
               echo 'Каталог <strong>'.$t['name'].'</strong>';
           else
               echo '<a href="?act=pre&arh='.$_GET['arh'].'&index='.$t['index'].'">'.$t['name'].
            '</a> ['.sizer($t['size']).'/'.sizer($t['comp_size']).']';
           echo'<br/>';
        }
        break;

   case('pre'):
        if($info = $zip->statIndex(abs((int)$_GET['index']))){
           echo 'Файл '.$info['name'].'<br/>
           <a href="?act=down&arh='.$_GET['arh'].'&index='.$info['index'].'">Скачать файл</a>
           <br/>
           Размер запакованого файла '.sizer($info['comp_size']).' ('.$info['comp_size'].' b)<br/>
           Размер распакованого файла: '.sizer($info['size']).' ('.$info['size'].' b)<br/>
           Метод сжатия: '.$info['comp_method'].'<br/>';
           $highlight=array('php','html','htm');
           $astext=array('txt','css','ini','htaccess');
           $type=substr($info['name'],strrpos($info['name'],'.')+1);
           if(in_array($type, $highlight)){
              highlight_string($zip->getFromIndex($info['index']));
           }elseif(in_array($type, $astext)){
              echo nl2br(htmlspecialchars($zip->getFromIndex($info['index'])));
           }
        }else
           echo 'Ошибка извлечения файла!';
    break;

   case('down'):
        $index = abs((int)$_GET['index']);
        if($name = $zip->getNameIndex($index)){
           header('Content-Type: application/octet-stream', true);
           header('Content-Disposition: attachment; filename="'.urlencode(basename($name)).'";');
           echo $zip->getFromIndex($index);
        }else
           echo 'Ошибка извлечения файла!';
    break;

   default:
        echo'Не известное действие';
        break;

}

$zip->close();
}else
   echo'Ошибка открытия архива!';

Пример 2. Просмотр ZIP-архива

$zip = zip_open("test2.zip");

if ($zip) {
    while ($zip_entry = zip_read($zip)) {
        echo "Name:               " . zip_entry_name($zip_entry) . "\n";
        echo "Actual Filesize:    " . zip_entry_filesize($zip_entry) . "\n";
        echo "Compressed Size:    " . zip_entry_compressedsize($zip_entry) . "\n";
        echo "Compression Method: " . zip_entry_compressionmethod($zip_entry) . "\n";

        if (zip_entry_open($zip, $zip_entry, "r")) {
            echo "File Contents:\n";
            $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
            echo "$buf\n";

            zip_entry_close($zip_entry);
        }
        echo "\n";
    }
    zip_close($zip);
}

.