uploadFile<T> method

Future<Either<ApiError, T>> uploadFile<T>(
  1. String path,
  2. T conversionFunc(
    1. dynamic json
    ),
  3. {required List<File> files,
  4. List<String> fieldName = const ["file"],
  5. Map<String, String>? fields,
  6. Map<String, String>? headers,
  7. Map<String, dynamic>? requestBody,
  8. Map<String, String>? queryParameters,
  9. Duration? timeoutDuration}
)

Implementation

Future<Either<ApiError, T>> uploadFile<T>(
    String path, T Function(dynamic json) conversionFunc,
    {required List<File> files,
    List<String> fieldName = const ["file"],
    Map<String, String>? fields,
    Map<String, String>? headers,
    Map<String, dynamic>? requestBody,
    Map<String, String>? queryParameters,
    Duration? timeoutDuration}) async {
  assert(files.length == fieldName.length);

  final uri = Uri.parse((_baseUrl ?? "") +
      path +
      (queryParameters?.entries
              .map((entry) => "${entry.key}=${entry.value}")
              .fold("?", (previous, current) {
            if (previous == "?") {
              return "?$current";
            }
            return "$previous&$current";
          }) ??
          ""));
  final request = http.MultipartRequest("POST", uri);

  for (int i = 0; i < files.length; i++) {
    final mimeType = getMimeTypeForFile(files[i].path);
    final parts = mimeType.split('/');
    print("PART : $parts");
    final multipartFile = await http.MultipartFile.fromPath(
      fieldName[i],
      files[i].path,
      contentType: MediaType(parts[0], parts[i]),
    );
    request.files.add(multipartFile);
  }

  if (fields != null) {
    request.fields.addAll(fields);
  }

  request.headers.addAll({
    ...?_defaultHeaders,
    if (_accessToken != null) "Authorization": "Bearer $_accessToken",
    ...?headers,
  });
  try {
    final streamedResponse = await request
        .send()
        .timeout(timeoutDuration ?? const Duration(seconds: 60));
    final response = await http.Response.fromStream(streamedResponse);
    return _handleApiResult(Future.value(response), path)
        .mapRight(conversionFunc);
  } catch (e) {
    return Left(ApiError(
        httpErrorCode: 500,
        message: e.toString(),
        apiStatusCode: "Error on upload file"));
  }
}