smartReadFile icon indicating copy to clipboard operation
smartReadFile copied to clipboard

Works without Range

Open let-aurn opened this issue 8 years ago • 0 comments

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)

let-aurn avatar Sep 10 '16 18:09 let-aurn