sendMultipartRequest static method

Future<StreamedResponse?> sendMultipartRequest({
  1. required String requestId,
  2. required RequestType requestType,
  3. required String url,
  4. String token = '',
  5. Map<String, dynamic>? fields,
  6. Map<String, String>? head,
  7. Map<String, List<File>>? filesMap,
})

Implementation

static Future<http.StreamedResponse?> sendMultipartRequest({
  required String requestId,
  required RequestType requestType,
  required String url,
  String token = '',
  Map<String, dynamic>? fields,
  Map<String, String>? head,
  Map<String, List<File>>? filesMap, // 👈 dynamic file groups
}) async {
  try {
    var uri = Uri.parse(url);
    var request = http.MultipartRequest(
      requestType == RequestType.post ? 'POST' : 'PUT',
      uri,
    );

    final client = http.Client();
    _activeClients[requestId] = client;

    request.headers.addAll(head ?? _getHeaders(token, 'multipart/form-data'));

    // Add fields
    fields?.forEach((key, value) {
      request.fields[key] = value.toString();
    });

    // Add multiple files per field
    if (filesMap != null) {
      for (var entry in filesMap.entries) {
        final fieldName = entry.key;
        final files = entry.value;

        for (var file in files) {
          request.files.add(
            await http.MultipartFile.fromPath(fieldName, file.path),
          );
        }
      }
    }

    final streamedResponse = await client
        .send(request)
        .timeout(
          const Duration(seconds: 120),
          onTimeout: () => throw "Request Timeout",
        );

    _activeClients.remove(requestId);
    return streamedResponse;
  } on SocketException {
    throw "No internet connection.";
  } on TimeoutException {
    throw "Request Timeout";
  } on HandshakeException {
    throw "Connection terminated during handshake";
  } catch (e) {
    throw e.toString();
  }
}