Отправить заявку

PHP ZIP - закачиваем на сервер все одним файлом

Нам ежедневно приходится загружать по ftp сотни, а то и тысячи мелких (и не очень) файлов. Хоть скорость интернета и приличная - все равно это очень долго - а время как известно - это деньги!Решение - простое и просто великолепное. Архивируется все файлы в один ZIP архив. Он быстро закачивается на сервер - а там идет распаковка с сохранением вложенности всех директорий. Таким образом - установка своей CMS системы - у нас занимает не более минуты и это с загрузкой, распаковкой, инсталляцией данных в MySQL и всем, всем, всем...

Скачать php zip

В архиве лежит сам класс и файл для работы с ним!
Вот его код:

<?
include "pclzip.lib.php";

// Функция возвращает расширение файла
function getFileExt( $file ) {
  $tmp = pathinfo($file);
  if ( !empty( $tmp['extension'] ) )
    return $tmp['extension'];
  else
    return '';
}

// Функция возвращает размер файла
function getFileSize( $size ) {
  $times = 0;
  $comma = '.';
  while ($size>1024) {
    $times++;
    $size = $size/1024;
  }
  $size2 = floor($size);
  $rest = $size - $size2;
  $rest = $rest * 100;
  $decimal = floor($rest);

  $addsize = $decimal;
  if ($decimal<10) $addsize .= '0';

  if ($times == 0) 
    $addsize = $size2;
  else
    $addsize = $size2.$comma.substr($addsize,0,2);

  switch ($times) {
    case 0 : $mega = ' bytes'; break;
    case 1 : $mega = ' KB'; break;
    case 2 : $mega = ' MB'; break;
    case 3 : $mega = ' GB'; break;
    case 4 : $mega = ' TB'; break;
  }

  $addsize .= $mega;

  return $addsize;
}

// Рекурсивная функция для удаления каталога
function removeDir( $dir )
{
  if ( $d = opendir($dir) ) {
    while( ($file = readdir($d)) !== false ) {
      if ( is_file($dir.'/'.$file) ) {
        unlink($dir.'/'.$file);
      } else if ( is_dir($dir.'/'.$file) and $file != '.' and $file != '..' ) {
        removeDir($dir.'/'.$file);
      }
    }
    closedir($d);
  }
  return rmdir($dir);
}

$dir = '.';
if ( isset( $_GET['dir'] ) ) $dir = $_GET['dir'];

// ПЕРВАЯ ЧАСТЬ СКРИПТА - ПОКАЗАТЬ СПИСОК ДИРЕКТОРИЙ И ФАЙЛОВ
if ( is_dir($dir) ) { 
  chdir($dir);

  $basedir = getcwd();
  $basedir = str_replace('\\','/', $basedir);    

  // Родительская директория
  $parent = dirname($basedir);
  $cur = $basedir;
  // Путь до текущей директории
  $path = '';
  while (substr($cur, 0, 1) == '/') {
    $cur = substr($cur, 1, strlen($cur));
    $path .= '/'; 
  }
  $p_out = $path;
  while (strlen($cur) > 0) {
    $k = strpos($cur,'/');
    if (!strpos($cur,'/')) $k = strlen($cur);
    $s = substr($cur,0,$k);
    $cur = substr($cur, $k+1, strlen($cur));
    $path .= $s.'/';
    $p_out .= '<a href="'.$_SERVER['PHP_SELF'].'?dir='.$path.'">'.$s.'</a>/';
  }

  echo '<p class="currentDir">Текущая директория: '.$p_out.'</p>';
  echo '<div><img src="./images/folder.gif" alt="" />&nbsp;<a href="'.$_SERVER['PHP_SELF'].'?dir='.$parent.'"><strong>..</strong></a></div>'."\n";
  
  // Список файлов и директорий текущей директории
  $files = array();
  $folders = array();
  $zipFiles = array();
  if ( $dh = opendir( getcwd() ) ) {
    while (($file = readdir($dh)) !== false) {
      if ($file != '..' && $file != '.') {
	    if ( is_file( $file ) ) {
		  $files[] = $file;
		  if ( strtolower( getFileExt($file) ) == 'zip' ) $zipFiles[] = $file;
		}
		if ( is_dir( $file ) ) $folders[] = $file;
      }
    }
    closedir($dh);
  }
  
  echo '<p class="fileList">'."\n";
  echo '<img src="./images/folderopen.gif" alt="" />&nbsp;<strong>.</strong><br/>'."\n";
  // Выводим список поддерикторий текущей директории
  foreach ($folders as $file) {
      echo '&nbsp;&nbsp;<img src="./images/folder.gif" alt="" />&nbsp;<a href="'.$_SERVER['PHP_SELF'].'?dir='.$basedir.'/'.$file.'">'.$file.'</a><br/>'."\n";
  }
  // Выводим список файлов текущей директории
  foreach ($files as $file) {
    echo '&nbsp;&nbsp;<img src="./images/file.gif" alt="" />&nbsp;&nbsp;'.$file.'<br/>'."\n";
  }
  echo '</p>'."\n";
  
  if ( count( $zipFiles ) > 0 ) {
    echo '<p class="zipArchive">ZIP-архивы в текущей директории:</p>'."\n";
  // Выводим список архивов в текущей директории
    echo '<table width="30%">'."\n";
    foreach ($zipFiles as $file) {
	  echo '<tr>';
      echo '<td><img src="./images/zip.gif" alt="" /></td>';
	  echo '<td width="50%">'.$file.'</td>';
      echo '<td><a href="'.$_SERVER['PHP_SELF'].'?dir='.$basedir.'&unzip='.$file.'&action=view">Просмотр</a></td>';
	  echo '<td><a href="'.$_SERVER['PHP_SELF'].'?dir='.$basedir.'&unzip='.$file.'&action=unzip">Извлечь</a></td>'."\n";
	  echo '</tr>'."\n";
    }
	echo '</table>'."\n";
  }
}

// ВТОРАЯ ЧАСТЬ - ИЗВЛЕЧЕНИЕ ФАЙЛОВ ИЗ АРХИВА
if ( isset( $_GET['unzip'] ) ) $unzip = $_GET['unzip'];

if (isset( $unzip ) && is_file($unzip)) {

  $zip = new PclZip($unzip);
  if (($list = $zip->listContent()) == 0) die('Ошибка: '.$zip->errorInfo(true));

  // Данные об архиве
  $compSize = 0; // Размер в сжатом виде
  $uncompSize = 0; // Размер распакованного архива
  $fold = 0; // Количество директорий в архиве
  $fil = 0; // Количество файлов в архиве
  for ( $i = 0; $i < sizeof($list); $i++ ) {
    if ($list[$i]['folder'] == 1) {
	  $fold++;
      $dirs[$fold] = $list[$i]['stored_filename'];
	  // Создаем папки, куда будут распакованы файлы архива
      if ($_GET['action'] == 'unzip') {
        $dirname = $list[$i]['stored_filename'];
        $dirname = substr($dirname, 0, strlen($dirname)-1);
		// Если такая дериктория уже существует - удаляем 
		// ее вместе со всем содержимым
        if ( is_dir($basedir.'/'.$dirname) ) removeDir( $basedir.'/'.$dirname );
		mkdir($basedir.'/'.$dirname);
		chmod($basedir.'/'.$dirname, 0777);
      }
    } else {
	  $fil++;
    }
    $compSize += $list[$i]['compressed_size'];
    $uncompSize += $list[$i]['size'];
  }

  echo '<p class="archiveInfo">Информация об архиве '.$unzip.'</p>'."\n";
  echo '<p>'."\n";
  echo $fil.' файлов и '.$fold.' директорий<br/>'."\n";
  echo 'Размер в сжатом виде: '.getFileSize($compSize).'<br/>'."\n";
  echo 'Размер в распакованном виде: '.getFileSize($uncompSize).'<br/>'."\n";
  echo '</p>'."\n";

  if ($_GET['action'] == 'unzip') {
    echo '<p>Извлечение файлов из архива...</p>'."\n";
    $zip->extract('');
    echo '<p>Архив распакован.</p>'."\n";
  }

  if ($_GET['action'] == 'view') {
    echo '<p class="archiveList">'."\n";
    for ( $i = 0; $i < sizeof($list); $i++ ) {
      if ($list[$i]['folder'] == 1) {
        echo '<img src="./images/folder.gif" alt="" />&nbsp&nbsp;'.$list[$i]['stored_filename'].'<br/>'."\n";
      } else {
        echo '<img src="./images/file.gif" alt="" />&nbsp&nbsp;'.$list[$i]['stored_filename'];
		echo ' ('.getFileSize($list[$i]['size']).')<br/>'."\n";
      }
    }
    echo '</p>'."\n";
  }
}
?>
Другие публикации