- Модуль: iblock
- Путь к файлу: ~/bitrix/modules/iblock/classes/mysql/cml2.php
- Класс: CIBlockXMLFile
- Вызов: CIBlockXMLFile::safeUnZip
static function safeUnZip(string $fileName, ?int $lastIndex = null, int $interval = 0): array
{
$result = [
'STATUS' => self::UNPACK_STATUS_FINAL,
'DATA' => []
];
$startTime = time();
$dirName = mb_substr($fileName, 0, mb_strrpos($fileName, '/') + 1);
if (mb_strlen($dirName) <= mb_strlen($_SERVER['DOCUMENT_ROOT']))
{
$result['STATUS'] = self::UNPACK_STATUS_ERROR;
return $result;
}
/** @var CZip $archiver */
$archiver = CBXArchive::GetArchive($fileName, 'ZIP');
if (!($archiver instanceof IBXArchive))
{
$result['STATUS'] = self::UNPACK_STATUS_ERROR;
return $result;
}
if ($lastIndex !== null && $lastIndex < 0)
{
$lastIndex = null;
}
$archiveProperties = $archiver->GetProperties();
if (!is_array($archiveProperties))
{
$result['STATUS'] = self::UNPACK_STATUS_ERROR;
return $result;
}
if (!isset($archiveProperties['nb']))
{
$result['STATUS'] = self::UNPACK_STATUS_ERROR;
return $result;
}
$entries = (int)$archiveProperties['nb'];
for ($index = 0; $index < $entries; $index++)
{
if ($lastIndex !== null)
{
if ($lastIndex >= $index)
{
continue;
}
}
$archiver->SetOptions([
'RULE' => [
'by_index' => [
[
'start' => $index,
'end' => $index,
]
]
]
]);
$stepResult = $archiver->Unpack($dirName);
if ($stepResult === true)
{
return $result;
}
if ($stepResult === false)
{
$result['STATUS'] = self::UNPACK_STATUS_ERROR;
return $result;
}
if ($interval > 0 && (time() - $startTime) > $interval)
{
$result['STATUS'] = self::UNPACK_STATUS_CONTINUE;
$result['DATA']['LAST_INDEX'] = $index;
return $result;
}
}
return $result;
}