sendFile method
Sends a file response with proper MIME type detection and Range support.
Implementation
Future<void> sendFile(
File file, {
String? contentType,
String? rangeHeader,
}) async {
if (_sent) return;
final mimeType =
contentType ?? lookupMimeType(file.path) ?? 'application/octet-stream';
_headers.setContentTypeString(mimeType);
final length = await file.length();
// Handle Range Request
if (rangeHeader != null && rangeHeader.startsWith('bytes=')) {
final ranges = rangeHeader.substring(6).split('-');
if (ranges.length == 2) {
final start = int.tryParse(ranges[0]) ?? 0;
final end = int.tryParse(ranges[1]) ?? length - 1;
if (start >= 0 && end < length && start <= end) {
final contentLength = end - start + 1;
_response.statusCode = HttpStatus.partialContent;
_headers.setHeader('Content-Range', 'bytes $start-$end/$length');
_headers.setContentLength(contentLength);
_headers.setHeader('Accept-Ranges', 'bytes');
await _response.addStream(file.openRead(start, end + 1));
_closeResponse();
return;
}
}
}
// Standard file response
_headers.setContentLength(length);
_headers.setHeader('Accept-Ranges', 'bytes');
await _response.addStream(file.openRead());
_closeResponse();
}