multipartRequest static method

Future<ApiCallResponse> multipartRequest(
  1. ApiCallType? type,
  2. String apiUrl,
  3. Map<String, dynamic> headers,
  4. Map<String, dynamic> params,
  5. bool returnBody,
  6. bool decodeUtf8,
)

Implementation

static Future<ApiCallResponse> multipartRequest(
  ApiCallType? type,
  String apiUrl,
  Map<String, dynamic> headers,
  Map<String, dynamic> params,
  bool returnBody,
  bool decodeUtf8,
) async {
  assert({ApiCallType.POST, ApiCallType.PUT, ApiCallType.PATCH}.contains(type), 'Invalid ApiCallType $type for request with body');
  isFile(e) => e is FFUploadedFile || (!kIsWeb && e is File) || e is List<FFUploadedFile> || (e is List && e.firstOrNull is FFUploadedFile);
  final nonFileParams = Map.fromEntries(params.entries.where((e) => !isFile(e.value)));
  List<http.MultipartFile> files = [];
  params.entries.where((e) => isFile(e.value)).forEach((e) {
    final param = e.value;
    final uploadedFiles = param is List ? param as List<FFUploadedFile> : [param as FFUploadedFile];
    for (var uploadedFile in uploadedFiles) {
      files.add(
        http.MultipartFile.fromBytes(
          e.key,
          uploadedFile.clMedia.file?.bytes ?? Uint8List.fromList([]),
          filename: uploadedFile.clMedia.file?.name,
          contentType: _getMediaType(uploadedFile.clMedia.file?.name),
        ),
      );
    }
  });
  final request =
      http.MultipartRequest(type.toString().split('.').last, Uri.parse(apiUrl))
        ..headers.addAll(toStringMap(headers))
        ..files.addAll(files);
  nonFileParams.forEach((key, value) => request.fields[key] = value.toString());

  final streamed = await request.send().timeout(_effectiveTimeout);
  final response = await http.Response.fromStream(streamed);
  return ApiCallResponse.fromHttpResponse(response, returnBody, decodeUtf8);
}