Использование класса ZipArchive в PHP

Я использую этот код для чтения содержимого защищенного каталога (имя пользователя и пароль), называемого (защита).

<?php
require_once("admin/global.inc.php");

// increase script timeout value
ini_set('max_execution_time', 300);

//Generate a new flag
$random = (rand(000000,999999));
$date = date("y-m-d");

// create object
$zip = new ZipArchive();

// open archive 
if ($zip->open("$date-$random.zip", ZIPARCHIVE::CREATE) !== TRUE) {
    die ("Could not open archive");
}

// initialize an iterator
// pass it the directory to be processed
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("protect/")); //check question #2

// iterate over the directory
// add each file found to the archive
foreach ($iterator as $key=>$value) {
        if ($key != 'protect/.htaccess')
                {
    $zip->addFile(realpath($key), $key) or die ("ERROR: Could not add file: $key");        
$query="INSERT INTO `archives_logs` (`id`, `file`, `flag`, `date`) VALUES (NULL, '$key', '$random', '$date')";
            $query_result = mysql_query ($query);
                }
}

// close and save archive
$zip->close();
echo "Archive created successfully.";    
?>

Если я помещаю свой файл кода в место, отличное от защищенного каталога, мне нужно изменить путь к каталогу, который нужно сжать, что нормально, НО проблема в том, что все каталоги в пути включены в Zip-архив. Итак, если открыть сжатый файл, я получаю: www/username/public_html/etc...

Вот структура каталогов: www/protect/(здесь должны быть сжаты файлы) www/compress_code.php (вот мой текущий файл кода)

Путь, по которому я хочу разместить свой файл кода: www/protect/admin/files/compress_code.php

Q1) Как сохранить файл кода в последнем указанном месте БЕЗ включения пути в файл ZipArchive?

Q2) Когда мой код находится в том же месте каталога, который нужно сжать, и когда я открываю сжатый файл, я вижу, защитите/(файлы). Могу ли я добавить только содержимое защищенного каталога в Zip-архив, не включая сам каталог?


person Manikandan Thangaraj    schedule 03.08.2011    source источник


Ответы (1)


Это довольно просто:

  1. Сохраните целевой путь в переменной.
  2. Удалите целевой путь из локального имени перед добавлением файла.

Нравится:

$flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::SKIP_DOTS;
$target = 'protect/';
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($target, $flags));

foreach ($iterator as $key=>$value) {
    if ($key != "{$target}.htaccess")
    {
        $localname = substr($key, strlen($target));
        $zip->addFile($key, $localname) or die ("ERROR: Could not add file: $key");
    }
}

Это должно фактически ответить на оба ваших вопроса.

person netcoder    schedule 03.08.2011