Your IP : 18.219.123.56


Current Path : /home/bitrix/ext_www/dev.home-comfort.in.ua/bitrix/components/bitrix/lists.file/
Upload File :
Current File : /home/bitrix/ext_www/dev.home-comfort.in.ua/bitrix/components/bitrix/lists.file/component.php

<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();

if(!CModule::IncludeModule('lists'))
{
	ShowError(GetMessage("CC_BLF_MODULE_NOT_INSTALLED"));
	return;
}

$lists_perm = CListPermissions::CheckAccess(
	$USER,
	$arParams["~IBLOCK_TYPE_ID"],
	intval($arParams["~IBLOCK_ID"]),
	$arParams["~SOCNET_GROUP_ID"]
);
if($lists_perm < 0)
{
	switch($lists_perm)
	{
	case CListPermissions::WRONG_IBLOCK_TYPE:
		ShowError(GetMessage("CC_BLF_WRONG_IBLOCK_TYPE"));
		return;
	case CListPermissions::WRONG_IBLOCK:
		ShowError(GetMessage("CC_BLF_WRONG_IBLOCK"));
		return;
	default:
		ShowError(GetMessage("CC_BLF_UNKNOWN_ERROR"));
		return;
	}
}
elseif($lists_perm < CListPermissions::CAN_READ)
{
	ShowError(GetMessage("CC_BLF_ACCESS_DENIED"));
	return;
}

$arParams["CAN_EDIT"] = $lists_perm >= CListPermissions::IS_ADMIN;
$arResult["IBLOCK_PERM"] = $lists_perm;
$arResult["USER_GROUPS"] = $USER->GetUserGroupArray();
$arIBlock = CIBlock::GetArrayByID(intval($arParams["~IBLOCK_ID"]));

$arResult["FILES"] = array();
$arResult["ELEMENT"] = false;
$arResult["SECTION"] = false;

if($arParams["ELEMENT_ID"] > 0)
{
	$rsElement = CIBlockElement::GetList(
		array(),
		array(
			"IBLOCK_ID" => $arIBlock["ID"],
			"=ID" => $arParams["ELEMENT_ID"],
			"CHECK_PERMISSIONS" => ($arParams["CAN_EDIT"] || $arParams["SOCNET_GROUP_ID"]? "N": "Y"),
		),
		false,
		false,
		array("ID", $arParams["FIELD_ID"])
	);
	while($ar = $rsElement->GetNext())
	{
		if(isset($ar[$arParams["FIELD_ID"]]))
		{
			$arResult["FILES"][] = $ar[$arParams["FIELD_ID"]];
		}
		elseif(isset($ar[$arParams["FIELD_ID"]."_VALUE"]))
		{
			if(is_array($ar[$arParams["FIELD_ID"]."_VALUE"]))
				$arResult["FILES"] = array_merge($arResult["FILES"], $ar[$arParams["FIELD_ID"]."_VALUE"]);
			else
				$arResult["FILES"][] = $ar[$arParams["FIELD_ID"]."_VALUE"];
		}
		$arResult["ELEMENT"] = $ar;
	}
}
elseif($arParams["SECTION_ID"] > 0)
{
	$rsSection = CIBlockSection::GetList(
		array(),
		array(
			"IBLOCK_ID" => $arIBlock["ID"],
			"ID" => $arParams["SECTION_ID"],
			"GLOBAL_ACTIVE"=>"Y",
			"CHECK_PERMISSIONS" => ($arParams["CAN_EDIT"] || $arParams["SOCNET_GROUP_ID"]? "N": "Y"), //This cancels iblock permissions for trusted users
		),
		false,
		array("ID", $arParams["FIELD_ID"])
	);
	$arResult["SECTION"] = $rsSection->GetNext();
}

if(!in_array($arParams["FILE_ID"], $arResult["FILES"]))
{
	ShowError(GetMessage("CC_BLF_WRONG_FILE"));
}
else
{
	$arFile = CFile::GetFileArray($arParams["FILE_ID"]);
	if(is_array($arFile))
	{
		$APPLICATION->RestartBuffer();

		$filename = $_SERVER["DOCUMENT_ROOT"].$arFile["SRC"];
		$filesize = filesize($filename);
		$filetime = filemtime($filename);

		if($_SERVER["REQUEST_METHOD"]=="HEAD")
		{
			CHTTP::SetStatus("200 OK");
			header("Accept-Ranges: bytes");
			header("Content-Length: ".$filesize);
			header("Content-Type: ".$arFile["CONTENT_TYPE"]."; name=\"".$arFile["FILE_NAME"]."\"");
			header("Last-Modified: ".date("r", $filetime));
		}
		else
		{
			//Handle ETag
			$ETag = md5($filename.$filesize.$filetime);
			if(array_key_exists("HTTP_IF_NONE_MATCH", $_SERVER) && ($_SERVER['HTTP_IF_NONE_MATCH'] === $ETag))
			{
				CHTTP::SetStatus("304 Not Modified");
				die();
			}
			header("ETag: ".$ETag);

			//Handle Last Modified
			$lastModified = gmdate('D, d M Y H:i:s', $filetime).' GMT';
			if(array_key_exists("HTTP_IF_MODIFIED_SINCE", $_SERVER) && ($_SERVER['HTTP_IF_MODIFIED_SINCE'] === $lastModified))
			{
				CHTTP::SetStatus("304 Not Modified");
				die();
			}

			$cur_pos = 0;
			$size = $filesize - 1;
			if(isset($_SERVER["HTTP_RANGE"]) && preg_match("/^bytes=([0-9-,]+)$/", $_SERVER["HTTP_RANGE"], $arRange))
			{
				if(preg_match("/^(\\d*)-(\\d*)/", $arRange[1], $arFirstRange))
				{
					$size = IntVal($arFirstRange[2]);
					if($size <= 0)
						$size = $filesize - 1;

					$cur_pos = IntVal($arFirstRange[1]);
					if($cur_pos > $size)
					{
						$cur_pos = 0;
						$size = $filesize - 1;
					}
				}
			}

			if($cur_pos > 0)
				CHTTP::SetStatus("206 Partial Content");
			else
				CHTTP::SetStatus("200 OK");

			header("Content-Type: ".$arFile["CONTENT_TYPE"]."; name=\"".$arFile["FILE_NAME"]."\"");
			header("Content-Transfer-Encoding: binary");
			header("Content-Length: ".($size-$cur_pos+1));
			header("Content-Disposition: inline; filename=\"".$arFile["FILE_NAME"]."\"");
			header("Accept-Ranges: bytes");
			header("Content-Range: bytes ".$cur_pos."-".$size."/".$filesize);
			header("Cache-Control: private, max-age=10800, pre-check=10800");
			header("Expires: 0");
			header('Last-Modified: '.$lastModified);
			header("Pragma: public");

			$f = fopen($filename, "rb");
			fseek($f, $cur_pos);
			while($cur_pos <= $size)
			{
				$bufsize = 32768;
				if(($bufsize + $cur_pos) > $size)
					$bufsize = $size - $cur_pos + 1;

				echo fread($f, $bufsize);
				flush();

				$cur_pos += $bufsize;
			}
			fclose($f);
			die();
		}
	}
}
?>