note 86244 added to function.readfile
| From: | gaosipov at gmail dot com | Date: | Thu, 09 Oct 2008 09:08:23 +0000 |
| Subject: | note 86244 added to function.readfile | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-145203@lists.php.net to get a copy of this message | ||
Send file with HTTPRange support (partial download):
<?php
function smartReadFile($location, $filename, $mimeType='application/octet-stream')
{ if(!file_exists($location))
{ header ("HTTP/1.0 404 Not Found");
return;
}
$size=filesize($location);
$time=date('r',filemtime($location));
$fm=@fopen($location,'rb');
if(!$fm)
{ header ("HTTP/1.0 505 Internal server error");
return;
}
$begin=0;
$end=$size;
if(isset($_SERVER['HTTP_RANGE']))
{ if(preg_match('/bytes=\h*(\d+)-(\d*)[\D.*]?/i', $_SERVER['HTTP_RANGE'],
$matches))
{ $begin=intval($matches[0]);
if(!empty($matches[1]))
$end=intval($matches[1]);
}
}
if($begin>0||$end<$size)
header('HTTP/1.0 206 Partial Content');
else
header('HTTP/1.0 200 OK');
header("Content-Type: $mimeType");
header('Cache-Control: public, must-revalidate, max-age=0');
header('Pragma: no-cache');
header('Accept-Ranges: bytes');
header('Content-Length:'.($end-$begin));
header("Content-Range: bytes $begin-$end/$size");
header("Content-Disposition: inline; filename=$filename");
header("Content-Transfer-Encoding: binary\n");
header("Last-Modified: $time");
header('Connection: close');
$cur=$begin;
fseek($fm,$begin,0);
while(!feof($fm)&&$cur<$end&&(connection_status()==0))
{ print fread($fm,min(1024*16,$end-$cur));
$cur+=1024*16;
}
}
?>
Usage:
<?php
smartReadFile("/tmp/filename","myfile.mp3","audio/mpeg")
?>
It can be slow for big files to read by fread, but this is a single way to read file in strict
bounds. You can modify this and add fpassthru instead of fread and while, but it sends all data from
begin --- it would be not fruitful if request is bytes from 100 to 200 from 100mb file.
----
Server IP: 195.54.192.44
Probable Submitter: 127.0.0.1
----
Manual Page -- http://www.php.net/manual/en/function.readfile.php
Edit -- https://master.php.net/note/edit/86244
Del: integrated -- https://master.php.net/note/delete/86244/integrated
Del: useless -- https://master.php.net/note/delete/86244/useless
Del: bad code -- https://master.php.net/note/delete/86244/bad+code
Del: spam -- https://master.php.net/note/delete/86244/spam
Del: non-english -- https://master.php.net/note/delete/86244/non-english
Del: in docs -- https://master.php.net/note/delete/86244/in+docs
Del: other reasons-- https://master.php.net/note/delete/86244
Reject -- https://master.php.net/note/reject/86244
Search -- https://master.php.net/manage/user-notes.php