sendFile method

Future<void> sendFile(
  1. File file, {
  2. String? contentType,
  3. String? rangeHeader,
})

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();
}