@@ -40,69 +40,69 @@ |
||
| 40 | 40 | } |
| 41 | 41 | |
| 42 | 42 | return $response |
| 43 | - ->setOutputFormat(null) |
|
| 44 | - ->setBody(function () use ($file) { |
|
| 45 | - $stream = $file->get(); |
|
| 46 | - $name = $file->getName(); |
|
| 47 | - |
|
| 48 | - if (null === $stream) { |
|
| 49 | - return; |
|
| 50 | - } |
|
| 51 | - |
|
| 52 | - $size = $file->getSize(); |
|
| 53 | - $length = $size; |
|
| 54 | - $start = 0; |
|
| 55 | - $end = $size - 1; |
|
| 56 | - |
|
| 57 | - set_time_limit(0); |
|
| 58 | - if (isset($_SERVER['HTTP_RANGE'])) { |
|
| 59 | - header('Accept-Ranges: bytes'); |
|
| 60 | - $c_start = $start; |
|
| 61 | - $c_end = $end; |
|
| 62 | - list(, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2); |
|
| 63 | - |
|
| 64 | - if (strpos($range, ',') !== false) { |
|
| 65 | - header("Content-Range: bytes $start-$end/$size"); |
|
| 66 | - |
|
| 67 | - throw new Exception\InvalidRange('invalid offset/limit requested'); |
|
| 68 | - } |
|
| 69 | - |
|
| 70 | - if ($range == '-') { |
|
| 71 | - $c_start = $size - substr($range, 1); |
|
| 72 | - } else { |
|
| 73 | - $range = explode('-', $range); |
|
| 74 | - $c_start = $range[0]; |
|
| 75 | - $c_end = (isset($range[1]) && is_numeric($range[1])) ? $range[1] : $size; |
|
| 76 | - } |
|
| 77 | - |
|
| 78 | - $c_end = ($c_end > $end) ? $end : $c_end; |
|
| 79 | - if ($c_start > $c_end || $c_start > $size - 1 || $c_end >= $size) { |
|
| 80 | - header("Content-Range: bytes $start-$end/$size"); |
|
| 81 | - |
|
| 82 | - throw new Exception\InvalidRange('invalid offset/limit requested'); |
|
| 83 | - } |
|
| 84 | - |
|
| 85 | - $start = (int) $c_start; |
|
| 86 | - $end = (int) $c_end; |
|
| 87 | - $length = (int) $end - $start + 1; |
|
| 88 | - fseek($stream, $start); |
|
| 89 | - header('HTTP/1.1 206 Partial Content'); |
|
| 90 | - header("Content-Range: bytes $start-$end/$size"); |
|
| 91 | - } |
|
| 92 | - |
|
| 93 | - header('Content-Length: '.$length); |
|
| 94 | - $buffer = 1024 * 8; |
|
| 95 | - |
|
| 96 | - while (!feof($stream) && ($p = ftell($stream)) <= $end) { |
|
| 97 | - if ($p + $buffer > $end) { |
|
| 98 | - $buffer = $end - $p + 1; |
|
| 99 | - } |
|
| 100 | - |
|
| 101 | - echo fread($stream, $buffer); |
|
| 102 | - flush(); |
|
| 103 | - } |
|
| 104 | - |
|
| 105 | - fclose($stream); |
|
| 106 | - }); |
|
| 43 | + ->setOutputFormat(null) |
|
| 44 | + ->setBody(function () use ($file) { |
|
| 45 | + $stream = $file->get(); |
|
| 46 | + $name = $file->getName(); |
|
| 47 | + |
|
| 48 | + if (null === $stream) { |
|
| 49 | + return; |
|
| 50 | + } |
|
| 51 | + |
|
| 52 | + $size = $file->getSize(); |
|
| 53 | + $length = $size; |
|
| 54 | + $start = 0; |
|
| 55 | + $end = $size - 1; |
|
| 56 | + |
|
| 57 | + set_time_limit(0); |
|
| 58 | + if (isset($_SERVER['HTTP_RANGE'])) { |
|
| 59 | + header('Accept-Ranges: bytes'); |
|
| 60 | + $c_start = $start; |
|
| 61 | + $c_end = $end; |
|
| 62 | + list(, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2); |
|
| 63 | + |
|
| 64 | + if (strpos($range, ',') !== false) { |
|
| 65 | + header("Content-Range: bytes $start-$end/$size"); |
|
| 66 | + |
|
| 67 | + throw new Exception\InvalidRange('invalid offset/limit requested'); |
|
| 68 | + } |
|
| 69 | + |
|
| 70 | + if ($range == '-') { |
|
| 71 | + $c_start = $size - substr($range, 1); |
|
| 72 | + } else { |
|
| 73 | + $range = explode('-', $range); |
|
| 74 | + $c_start = $range[0]; |
|
| 75 | + $c_end = (isset($range[1]) && is_numeric($range[1])) ? $range[1] : $size; |
|
| 76 | + } |
|
| 77 | + |
|
| 78 | + $c_end = ($c_end > $end) ? $end : $c_end; |
|
| 79 | + if ($c_start > $c_end || $c_start > $size - 1 || $c_end >= $size) { |
|
| 80 | + header("Content-Range: bytes $start-$end/$size"); |
|
| 81 | + |
|
| 82 | + throw new Exception\InvalidRange('invalid offset/limit requested'); |
|
| 83 | + } |
|
| 84 | + |
|
| 85 | + $start = (int) $c_start; |
|
| 86 | + $end = (int) $c_end; |
|
| 87 | + $length = (int) $end - $start + 1; |
|
| 88 | + fseek($stream, $start); |
|
| 89 | + header('HTTP/1.1 206 Partial Content'); |
|
| 90 | + header("Content-Range: bytes $start-$end/$size"); |
|
| 91 | + } |
|
| 92 | + |
|
| 93 | + header('Content-Length: '.$length); |
|
| 94 | + $buffer = 1024 * 8; |
|
| 95 | + |
|
| 96 | + while (!feof($stream) && ($p = ftell($stream)) <= $end) { |
|
| 97 | + if ($p + $buffer > $end) { |
|
| 98 | + $buffer = $end - $p + 1; |
|
| 99 | + } |
|
| 100 | + |
|
| 101 | + echo fread($stream, $buffer); |
|
| 102 | + flush(); |
|
| 103 | + } |
|
| 104 | + |
|
| 105 | + fclose($stream); |
|
| 106 | + }); |
|
| 107 | 107 | } |
| 108 | 108 | } |