• Модуль: clouds
  • Путь к файлу: ~/bitrix/modules/clouds/classes/general/storage_service_s3.php
  • Класс: CCloudStorageService_S3
  • Вызов: CCloudStorageService_S3::ListFiles
function ListFiles($arBucket, $filePath, $bRecursive = false, $pageSize = 0, $pageMarker = '')
{
	global $APPLICATION;
	static $search = array("%7E");
	static $replace = array("~");
	$result = array(
		"dir" => array(),
		"file" => array(),
		"file_size" => array(),
		"file_mtime" => array(),
		"file_hash" => array(),
		"last_key" => "",
	);

	$filePath = trim($filePath, '/');
	if($filePath <> '')
	{
		$filePath .= '/';
	}

	if($arBucket["PREFIX"])
	{
		if(mb_substr($filePath, 0, mb_strlen($arBucket["PREFIX"]) + 2) != "/".$arBucket["PREFIX"]."/")
			$filePath = $arBucket["PREFIX"]."/".ltrim($filePath, "/");
	}
	$filePath = $APPLICATION->ConvertCharset($filePath, LANG_CHARSET, "UTF-8");

	$this->SetLocation($arBucket["LOCATION"]);
	$marker = $pageSize > 0? $filePath.$pageMarker: '';
	while(true)
	{
		$response = $this->SendRequest(
			$arBucket["SETTINGS"],
			'GET',
			$arBucket["BUCKET"],
			'/',
			'?'.($bRecursive? '': 'delimiter=%2F&').'prefix='.str_replace($search, $replace, rawurlencode($filePath))
				.'&marker='.rawurlencode($marker)
		);

		if(
			$this->status == 200
			&& is_array($response)
			&& isset($response["ListBucketResult"])
			&& is_array($response["ListBucketResult"])
			&& isset($response["ListBucketResult"]["#"])
			&& is_array($response["ListBucketResult"]["#"])
		)
		{
			if(
				isset($response["ListBucketResult"]["#"]["CommonPrefixes"])
				&& is_array($response["ListBucketResult"]["#"]["CommonPrefixes"])
			)
			{
				foreach($response["ListBucketResult"]["#"]["CommonPrefixes"] as $a)
				{
					$dir_name = mb_substr(rtrim($a["#"]["Prefix"][0]["#"], "/"), mb_strlen($filePath));
					$result["dir"][] = $APPLICATION->ConvertCharset($dir_name, "UTF-8", LANG_CHARSET);
				}
			}

			$lastKey = null;
			if(
				isset($response["ListBucketResult"]["#"]["Contents"])
				&& is_array($response["ListBucketResult"]["#"]["Contents"])
			)
			{
				foreach($response["ListBucketResult"]["#"]["Contents"] as $a)
				{
					$file_name = mb_substr($a["#"]["Key"][0]["#"], mb_strlen($filePath));
					if ($file_name <> '' && mb_substr($file_name, -1) !== '/')
					{
						$result["file"][] = $APPLICATION->ConvertCharset($file_name, "UTF-8", LANG_CHARSET);
						$result["file_size"][] = $a["#"]["Size"][0]["#"];
						$result["file_mtime"][] = mb_substr($a["#"]["LastModified"][0]["#"], 0, 19);
						$result["file_hash"][] = trim($a["#"]["ETag"][0]["#"], '"');
						$result["last_key"] = $APPLICATION->ConvertCharset($file_name, "UTF-8", LANG_CHARSET);
						$lastKey = $a["#"]["Key"][0]["#"];
						if ($pageSize > 0 && count($result["file"]) >= $pageSize)
						{
							return $result;
						}
					}
				}
			}

			if(
				isset($response["ListBucketResult"]["#"]["IsTruncated"])
				&& is_array($response["ListBucketResult"]["#"]["IsTruncated"])
				&& $response["ListBucketResult"]["#"]["IsTruncated"][0]["#"] === "true"
			)
			{
				if ($response["ListBucketResult"]["#"]["NextMarker"][0]["#"] <> '')
				{
					$marker = $response["ListBucketResult"]["#"]["NextMarker"][0]["#"];
					continue;
				}
				elseif ($lastKey !== null)
				{
					$marker = $lastKey;
					continue;
				}
			}

			break;
		}
		elseif ($this->checkForTokenExpiration($this->status, $this->result))
		{
			$this->tokenHasExpired = true;
			return false;
		}
		else
		{
			if (defined("BX_CLOUDS_ERROR_DEBUG"))
			{
				AddMessage2Log($this);
			}
			return false;
		}
	}

	return $result;
}