Небольшой скрипт,позволяющий получить zip-архив:
// Массив со списком путей, до архивируемых файлов
$arFiles = Array(74768, 74770);
foreach($arFiles as $iFileID) {
$arPackFiles[] = $_SERVER["DOCUMENT_ROOT"].CFile::GetPath($iFileID);
}
// Архивирование в zip
$packarc = CBXArchive::GetArchive($_SERVER["DOCUMENT_ROOT"]."/tmp.zip");
$pRes = $packarc->Pack($arPackFiles);
Как распаковать zip-архив я писал
ранее , но принцип аналогичный.
UPD:
Что бы в результирующем архиве исключить путь до папки upload можно написать так:
...
$packarc->SetOptions(Array(
"REMOVE_PATH" => $_SERVER["DOCUMENT_ROOT"]."/upload/",
));
$pRes = $packarc->Pack($arPackFiles);
UPD2:
Если нужно полностью исключить любые директории, то, похоже, придется копировать их во временную папку. Примерно так:
// Под архивируемые файлы выделяется директорияв /upload/tmp/
$sDirTmpName = randString(); // Имя временной папки
$sDirTmpPath = $_SERVER["DOCUMENT_ROOT"]."/upload/tmp/$sDirTmpName/"; // Серверный путь до временной папки
if(mkdir($sDirTmpPath)) { // Создание временной папки
foreach($arPackFiles as $k=>$sFileArcPath) { // Перебор всех файлов для архивирования
$arPackFiles[$k] = $sDirTmpPath.basename($sFileArcPath); // Новый путь архивируемого файла
copy($sFileArcPath, $arPackFiles[$k]); // И копирование во временную папку
}
// ... Создание архива из скопированных файлов
foreach($arPackFiles as $file) if(is_file($file)) unlink($file); // Удаление скопированных файлов
rmdir($sDirTmpPath); // Удаление временной папки
}