Нам ежедневно приходится загружать по ftp сотни, а то и тысячи мелких (и не очень) файлов. Хоть скорость интернета и приличная - все равно это очень долго - а время как известно - это деньги!Решение - простое и просто великолепное. Архивируется все файлы в один ZIP архив. Он быстро закачивается на сервер - а там идет распаковка с сохранением вложенности всех директорий. Таким образом - установка своей CMS системы - у нас занимает не более минуты и это с загрузкой, распаковкой, инсталляцией данных в MySQL и всем, всем, всем...
В архиве лежит сам класс и файл для работы с ним!
Вот его код:
<?
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="" /> <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="" /> <strong>.</strong><br/>'."\n";
// Выводим список поддерикторий текущей директории
foreach ($folders as $file) {
echo ' <img src="./images/folder.gif" alt="" /> <a href="'.$_SERVER['PHP_SELF'].'?dir='.$basedir.'/'.$file.'">'.$file.'</a><br/>'."\n";
}
// Выводим список файлов текущей директории
foreach ($files as $file) {
echo ' <img src="./images/file.gif" alt="" /> '.$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="" />  '.$list[$i]['stored_filename'].'<br/>'."\n";
} else {
echo '<img src="./images/file.gif" alt="" />  '.$list[$i]['stored_filename'];
echo ' ('.getFileSize($list[$i]['size']).')<br/>'."\n";
}
}
echo '</p>'."\n";
}
}
?>