- Модуль: 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();
}
}