smartReadFile
smartReadFile copied to clipboard
Works without Range
The initial code works well on desktop (Chrome OSX). But not on Safari (iOS).
I've comment out all about Range and now it works on iPhone too.
I did that because I've inspected requests on Chrome (desktop) and it seems it doesn't even use Ranges. Response is just 200 OK instead of 206 using Chrome on OSX.
Anyway, here is my current working code for Safari/Chrome on iOS (not tested on Android) :
$begin = 0;
$end = $size - 1;
// if (isset($_SERVER['HTTP_RANGE'])) {
// if (preg_match('/bytes=\h*(\d+)-(\d*)[\D.*]?/i', $_SERVER['HTTP_RANGE'], $matches)) {
// $begin = intval($matches[1]);
// if (!empty($matches[2])) {
// $end = intval($matches[2]);
// }
// }
// }
// if (isset($_SERVER['HTTP_RANGE'])) {
// header('HTTP/1.1 206 Partial Content');
// } else {
header('HTTP/1.1 200 OK');
// }
header("Content-Type: audio/mpeg");
header('Cache-Control: public, must-revalidate, max-age=0');
header('Pragma: no-cache');
header('Accept-Ranges: bytes');
header('Content-Length:' . (($end - $begin) + 1));
// if (isset($_SERVER['HTTP_RANGE'])) {
// header("Content-Range: bytes $begin-$end/$size");
// }
header("Content-Disposition: inline; filename=file.mp3");
header("Content-Transfer-Encoding: binary");
header("Last-Modified: $time");
\Log::info("=======");
\Log::info("Media : " . $location);
\Log::info("Range: " . (isset($_SERVER['HTTP_RANGE']) ? "Accepted" : "Not accepted"));
\Log::info("=======");
$cur = $begin;
fseek($fm, $begin, 0);
while (!feof($fm) && $cur <= $end && (connection_status() == 0)) {
print fread($fm, min(1024 * 16, ($end - $cur) + 1));
$cur += 1024 * 16;
}
PS : The code above doesn't work on Safari Desktop (works on Chrome desktop)