'video/mp4', 'webm' => 'video/webm', 'ogg' => 'video/ogg', 'mov' => 'video/quicktime', ]; $mime = $mimeTypes[$ext] ?? 'application/octet-stream'; $fileSize = filesize($filePath); header('Accept-Ranges: bytes'); header('Content-Type: ' . $mime); if (isset($_SERVER['HTTP_RANGE'])) { // Parse range header: "bytes=start-end" if (preg_match('/bytes=(\d+)-(\d*)/', $_SERVER['HTTP_RANGE'], $matches)) { $start = intval($matches[1]); $end = $matches[2] !== '' ? intval($matches[2]) : $fileSize - 1; if ($start > $end || $start >= $fileSize) { http_response_code(416); header("Content-Range: bytes */$fileSize"); return; } $end = min($end, $fileSize - 1); $length = $end - $start + 1; http_response_code(206); header("Content-Range: bytes $start-$end/$fileSize"); header("Content-Length: $length"); $fp = fopen($filePath, 'rb'); fseek($fp, $start); $remaining = $length; while ($remaining > 0 && !feof($fp)) { $chunk = min(8192, $remaining); echo fread($fp, $chunk); $remaining -= $chunk; } fclose($fp); } } else { header("Content-Length: $fileSize"); readfile($filePath); } }