it-blog.club
ZIP архивация файлов в Битрикс

ZIP архивация файлов в Битрикс

Если перед вами встала задача по архивации файлов на сервере и отдаче архива клиенту то вы можете поступить 2мя способами. Первый, это разумеется воспользоваться стандартными возможностями PHP. Ну и вторым способом будет реализация нужно функционала стандартными методами битрикса. Приступим:

Сразу сообщу что пример будет приведён не из пространства имён Битрикса, ну а например в вашем самописном модуле.

Я надеюсь что у вас необходимый класс где мы сможем написать наш чудо метод.

Начнём разумеется с создания функции


public function archive($arFiles)
 {

}

В качестве параметров ($arFiles) мы передаём массив ID-шников файлов.

Далее получаем наши файлы. получаем кстати именно сейчас, ибо если мы передали адреса, то не факт, что вы, указали бы их прям с серверным путём.



use \Bitrix\Main\Loader; //Подключаем если вы не в пространстве битрикса
Loader::includeModule('main'); //Подключаем если вы не в пространстве битрикса

class Archfile {

public function archive($arFiles)
{
foreach($arFiles as $iFileID) {
$arPackFiles[] = $_SERVER["DOCUMENT_ROOT"].\CFile::GetPath($iFileID);
}
}

}

Так, теперь у нас есть архив абсолютных путей к файлам.

Я сразу зайду немного вперёд и расскажу. Что при использовании стандартной битриксовой архивацией, пути к файлам в полученном в архиве, будут именно такими же. Т.е. Зайдя в ваш архив, вы можете увидеть нечто:

/w/data/server/ещё папка/новая папка 3/проект/doc/upload/d3/dskjsdkjf45345345/dsfjhsdkjfsdf/cat.png

Довольно пичально=( Так как мы то хотим увидеть, при открытии архива, наш файл, а не бродить по непонятным папкам. Именно по этому приведённый ниже пример сможет решить вашу проблему.

Опишу его принцип заранее.
1) Создаём папку с уникальным именем. Папка временная кстати, далее её удалим.
2) Пробегаемся по нашему архиву с файлами и копируем файлы во временную папку.
3) За одно меняем пусть до файла в нашем массиве
4) Делаем само архивирование
5) К счастью, мы может обрезать путь до файла ДО upload, при помощи специальных опций.
Если этого не сделать, то даже при копировании, путь до файла в архиве, будет начинаться с корня сервера.
6) Удаляем временные файлы и пупку.

Советую заранее создать папку zip в корне сайта, ибо в примере мы будем складывать архивы именно туда.



use \Bitrix\Main\Loader;
Loader::includeModule('main');

class Archfile
{

public function archive($arFiles)
{
foreach($arFiles as $iFileID) {
$arPackFiles[] = $_SERVER["DOCUMENT_ROOT"].\CFile::GetPath($iFileID);
}

$time = time();
$sDirTmpPath = $_SERVER["DOCUMENT_ROOT"]."/upload/$time/";// Серверный путь до временной папки
if(mkdir($sDirTmpPath)) { // Создание временной папки
foreach($arPackFiles as $k=>$sFileArcPath) { // Перебор всех файлов для архивирования
$arPackFiles[$k] = $sDirTmpPath.basename($sFileArcPath); // Новый путь архивируемого файла
copy($sFileArcPath, $arPackFiles[$k]); // И копирование во временную папку
}

// Архивирование в zip
$packarc = \CBXArchive::GetArchive($_SERVER["DOCUMENT_ROOT"]."/zip/".$time.".zip");
$packarc->SetOptions(Array( //Убираем путь до upload
"REMOVE_PATH" => $_SERVER["DOCUMENT_ROOT"]."/upload/",
));
$pRes = $packarc->Pack($arPackFiles);

foreach($arPackFiles as $file){
if(is_file($file)) unlink($file);
} // Удаление скопированных файлов
rmdir($sDirTmpPath); // Удаление временной папки
}
return '/zip/'.$time.'.zip';
}
}

Собственно всё. Я бы хотел выразить огромную благодарность Постоеву Олегу, участнику сообщества разработчиков на официальном сайта битрикса. Приведённый выше пример полностью рабочий и за основу была взята вот эта статья!


it-blog.club 874
Автор: Ярослав Хмель


Если Вам понравилась статья, то можете поддержать блог переведя N сумму на кофе авторам или оплату хостинга!
В любом случае спасибо! А так же не забывайте про группу в ВК
ПОИСК ПО САЙТУ
Поддержать