• Модуль: clouds
  • Путь к файлу: ~/bitrix/modules/clouds/classes/general/storage.php
  • Класс: CCloudStorage
  • Вызов: CCloudStorage::OnBeforeResizeImage
static function OnBeforeResizeImage($arFile, $arResizeParams, &$callbackData, &$bNeedResize, &$sourceImageFile, &$cacheImageFileTmp)
{
	$callbackData = null;

	if (intval($arFile["HANDLER_ID"]) <= 0)
		return false;

	$obSourceBucket = new CCloudStorageBucket(intval($arFile["HANDLER_ID"]));
	if (!$obSourceBucket->Init())
		return false;

	$callbackData = /*.(array[string]mixed).*/
		array();
	$callbackData["obSourceBucket"] = $obSourceBucket;

	//Assume target bucket same as source
	$callbackData["obTargetBucket"] = $obTargetBucket = $obSourceBucket;

	//if original file bucket is read only
	if ($obSourceBucket->READ_ONLY === "Y") //Try to find bucket with write rights
	{
		$bucket = CCloudStorage::FindBucketForFile($arFile, $arFile["FILE_NAME"]);
		if (!is_object($bucket))
			return false;
		if ($bucket->Init())
		{
			$callbackData["obTargetBucket"] = $obTargetBucket = $bucket;
		}
	}

	if (!$arFile["SRC"])
	{
		$arFile["SRC"] = $obSourceBucket->GetFileSRC($arFile, false);
	}

	if (defined("BX_MOBILE") && constant("BX_MOBILE") === true)
		$bImmediate = true;
	else
		$bImmediate = $arResizeParams[5];

	$callbackData["cacheID"] = $arFile["ID"]."/".md5(serialize($arResizeParams));
	$callbackData["cacheOBJ"] = new CPHPCache;
	$callbackData["fileDIR"] = "/"."resize_cache/".$callbackData["cacheID"]."/".$arFile["SUBDIR"];
	$callbackData["fileNAME"] = $arFile["FILE_NAME"];
	$callbackData["fileURL"] = $callbackData["fileDIR"]."/".$callbackData["fileNAME"];

	$result = true;
	if ($callbackData["cacheOBJ"]->StartDataCache(CACHED_clouds_file_resize, $callbackData["cacheID"], "clouds"))
	{
		$cacheImageFile = $obTargetBucket->GetFileSRC($callbackData["fileURL"], false);
		$arDestinationSize = array();

		//Check if it is cache file was deleted, but there was a successful resize
		$delayInfo = $bImmediate ? false : CCloudStorage::ResizeImageFileGet($cacheImageFile);
		if (is_array($delayInfo) && ($delayInfo["ERROR_CODE"] < 10))
		{
			$callbackData["cacheSTARTED"] = true;
			if ($arFile["FILE_SIZE"] > 1)
				$callbackData["fileSize"] = $arFile["FILE_SIZE"];
			$bNeedResize = false;
			$result = true;
		}
		//Check if it is cache file was deleted, but not the file in the cloud
		elseif ($fs = $obTargetBucket->FileExists($callbackData["fileURL"]))
		{
			//If file was resized before the fact was registered
			if (COption::GetOptionString("clouds", "delayed_resize") === "Y")
			{
				CCloudStorage::ResizeImageFileAdd(
					$arDestinationSize,
					$arFile,
					$cacheImageFile,
					$arResizeParams,
					9 //already where
				);
			}

			$callbackData["cacheSTARTED"] = true;
			if ($fs > 1)
				$callbackData["fileSize"] = $fs;
			$bNeedResize = false;
			$result = true;
		}
		else
		{
			$callbackData["tmpFile"] = CFile::GetTempName('', $arFile["FILE_NAME"]);
			$callbackData["tmpFile"] = preg_replace("#[\\\/]+#", "/", $callbackData["tmpFile"]);

			if (
				!$bImmediate
				&& COption::GetOptionString("clouds", "delayed_resize") === "Y"
				&& CCloudStorage::ResizeImageFileDelay(
					$arDestinationSize,
					$arFile,
					$cacheImageFile,
					$arResizeParams
				)
			)
			{
				$callbackData["delayedResize"] = true;
				$callbackData["cacheSTARTED"] = false;
				$bNeedResize = false;
				$callbackData["cacheOBJ"]->AbortDataCache();
				$callbackData["cacheVARS"] = array(
					"cacheImageFile" => $cacheImageFile,
					"width" => $arDestinationSize["width"],
					"height" => $arDestinationSize["height"],
					"size" => null,
				);
				$result = true;
			}
			elseif ($obSourceBucket->DownloadToFile($arFile, $callbackData["tmpFile"]))
			{
				$callbackData["cacheSTARTED"] = true;
				$bNeedResize = true;
				$sourceImageFile = $callbackData["tmpFile"];
				$cacheImageFileTmp = CFile::GetTempName('', $arFile["FILE_NAME"]);
				$result = true;
			}
			else
			{
				$callbackData["cacheSTARTED"] = false;
				$bNeedResize = false;
				$callbackData["cacheOBJ"]->AbortDataCache();
				$result = false;
			}
		}
	}
	else
	{
		$callbackData["cacheSTARTED"] = false;
		$callbackData["cacheVARS"] = $callbackData["cacheOBJ"]->GetVars();
		$bNeedResize = false;
		$result = true;
	}

	return $result;
}