postMultipartMultiple method
Make POST request with multiple files (multipart) Accepts Map<String, dynamic> where keys are field names and values are files Example: {'front': file1, 'back': file2}
Implementation
Future<http.Response> postMultipartMultiple(
String endpoint, {
required Map<String, dynamic>
files, // Map of fieldName -> file (File on mobile, XFile on web)
Map<String, String>? fields,
Map<String, String>? headers,
}) async {
try {
final uri = Uri.parse('${_config.baseUrl}$endpoint');
if (_config.enableLogging) {
debugPrint('[ApexKYC] POST Multipart Multiple $uri');
debugPrint('[ApexKYC] Files: ${files.keys.join(", ")}');
}
final request = http.MultipartRequest('POST', uri);
// Add headers
final requestHeaders = _getHeaders(additionalHeaders: headers);
requestHeaders.remove('Content-Type'); // Let multipart set it
request.headers.addAll(requestHeaders);
// Add files - handle web vs mobile differently
for (var entry in files.entries) {
final fieldName = entry.key;
final file = entry.value;
if (kIsWeb) {
// Web platform - use XFile
final xFile = file as XFile;
final bytes = await xFile.readAsBytes();
final filename = xFile.name.isNotEmpty
? xFile.name
: '${fieldName}_${DateTime.now().millisecondsSinceEpoch}.jpg';
final contentType = xFile.mimeType ?? 'image/jpeg';
final multipartFile = http.MultipartFile.fromBytes(
fieldName,
bytes,
filename: filename,
contentType: MediaType.parse(contentType),
);
request.files.add(multipartFile);
} else {
// Mobile platform - use File
final fileStream = _getFileStream(file);
final fileLength = await _getFileLength(file);
final filename = _getFileName(file);
final multipartFile = http.MultipartFile(
fieldName,
fileStream,
fileLength,
filename: filename,
contentType: MediaType('image', 'jpeg'),
);
request.files.add(multipartFile);
}
}
// Add additional fields
if (fields != null) {
request.fields.addAll(fields);
}
final streamedResponse = await _client
.send(request)
.timeout(Duration(seconds: _config.timeoutSeconds));
final response = await http.Response.fromStream(streamedResponse);
if (_config.enableLogging) {
debugPrint(
'[ApexKYC] Response: ${response.statusCode} ${response.body}',
);
}
return _handleResponse(response);
} catch (e) {
if (e is ApexKycException) {
rethrow;
}
throw ApexKycException(
'Unexpected error: ${e.toString()}',
originalError: e,
);
}
}