Cześć,
nie wiem czy wyrażam się poprawnie, ale trudno... chodzi mi o to czy jest możliwy streaming pobieranego pliku? Chodzi o to, że pobieram jakiś plik z serwera i w tym pośredniczy inny serwer (chodzi o to, że plik nie jest na niego bezpośrednio zapisywany, a tylko pośredniczy w połączeniu)? Znalazłem na php.net funkcję i zaciekawiła minie... bo wydaje mi się, że tak działa, proszę o zerknięcie na to i odpowiedź:
<?php
function dl_file_resumable($file, $is_resume=TRUE)
{
//First, see if the file exists
{
die("<b>404 File not found!</b>"); }
//Gather relevent info about file
//workaround for IE filename bug with multiple periods / multiple dots in filename
//that adds square brackets to filename - eg. setup.abc.exe becomes setup[1].abc.exe
$filename = (strstr($_SERVER['HTTP_USER_AGENT'], 'MSIE')) ?
$fileinfo['basename'];
$file_extension = strtolower($path_info['extension']);
//This will set the Content-Type to the appropriate setting for the file
switch($file_extension)
{
case 'exe': $ctype='application/octet-stream'; break;
case 'zip': $ctype='application/zip'; break;
case 'mp3': $ctype='audio/mpeg'; break;
case 'mpg': $ctype='video/mpeg'; break;
case 'avi': $ctype='video/x-msvideo'; break;
default: $ctype='application/force-download';
}
//check if http_range is sent by browser (or download manager)
if($is_resume && isset($_SERVER['HTTP_RANGE'])) {
list
($size_unit, $range_orig) = explode('=', $_SERVER['HTTP_RANGE'], 2
);
if ($size_unit == 'bytes')
{
//multiple ranges could be specified at the same time, but for simplicity only serve the first range
//http://tools.ietf.org/id/draft-ietf-http-range-retrieval-00.txt
list
($range, $extra_ranges) = explode(',', $range_orig, 2
); }
else
{
$range = '';
}
}
else
{
$range = '';
}
//figure out download piece from range (if set)
list
($seek_start, $seek_end) = explode('-', $range, 2
);
//set start and end based on range (if set), else set defaults
//also check for invalid ranges.
$seek_end = (empty($seek_end)) ?
($size - 1
) : min(abs(intval($seek_end)),($size - 1
));
//add headers if resumable
if ($is_resume)
{
//Only send partial content header if downloading a piece of the file (IE workaround)
if ($seek_start > 0 || $seek_end < ($size - 1))
{
header('HTTP/1.1 206 Partial Content'); }
header('Accept-Ranges: bytes'); header('Content-Range: bytes '.$seek_start.'-'.$seek_end.'/'.$size); }
//headers for IE Bugs (is this necessary?)
//header("Cache-Control: cache, must-revalidate");
//header("Pragma: public");
header('Content-Type: ' . $ctype); header('Content-Disposition: attachment; filename="' . $filename . '"'); header('Content-Length: '.($seek_end - $seek_start + 1
));
//open the file
$fp = fopen($file, 'rb'); //seek to start of missing part
//start buffered download
{
//reset time limit for big files
}
}
?>
Dodatkowo czy jest możliwość zrobienia czegoś takiego w curl?
Ten post edytował sannin 2.11.2010, 23:30:03