• Модуль: webdav
  • Путь к файлу: ~/bitrix/modules/webdav/classes/general.php
  • Класс: CWebDavBase
  • Вызов: CWebDavBase::SendFileFromStream
function SendFileFromStream($stream, $mimetype, $sizeO = 0, $ranges=array())
{
	if((count($ranges) == 0) || (0!==fseek($stream, 0, SEEK_SET)))
	{
		if ($sizeO > 0)
		{
			self::set_header('Content-length: '.$sizeO);
			self::set_header('Content-range: 0-' . ($sizeO-1) . '/'. $sizeO);
		}

		while (@ob_end_clean());
		if(is_resource($stream))
		{
			fpassthru($stream);
		}
		return;
	}

	$multipart = (count($ranges) > 1);

	if($multipart)
	{
		$this->_multipart_byterange_header();
	}
	$to = 0;

	foreach($ranges as $range)
	{
		$isStart = isset($range['start']);
		if($isStart)
		{
			$from = intval($range['start']);
			$to = (!empty($range['end']) && intval($range['end']) > 0) ? intval($range['end']) : $sizeO-1;
		}
		else
		{
			$from = $sizeO - $range['last']-1;
			$to = $sizeO -1;
		}

		fseek($stream, $from, SEEK_SET);

		$size = $to - $from + 1;
		if($multipart)
		{
			$total = isset($sizeO) ? $sizeO : '*';
			$this->_multipart_byterange_header($mimetype, $from, $to, $total);
		}
		else
		{
			if(feof($stream))
			{
				$this->ThrowError("416 Requested range not satisfiable", 'WEBDAV_RANGES_ERROR', '', __FILE__.' '.__LINE__);
				return;
			}

			if($isStart)
			{
				$this->SetStatus('206 partial');
				self::set_header('Content-range: ' . $from . '-' . $to . '/'. $sizeO);
			}
			self::set_header('Content-length: '.$size);

			while (@ob_end_clean());
		}

		while($size && !feof($stream))
		{
			$s = ($size < 8192) ? $size : 8192;
			$buffer = fread($stream, $s);
			$size -= $this->strlen($buffer);
			echo $buffer;
		}
	}
	if($multipart)
	{
		$this->_multipart_byterange_header();
	}

}