requestfile function

Future<Response> requestfile(
  1. RequestApiHelperData config, {
  2. dynamic onProgress(
    1. int uploaded,
    2. int total
    )?,
})

Implementation

Future<Response> requestfile(RequestApiHelperData config, {Function(int uploaded, int total)? onProgress}) async {
  final httpClients = getHttpClient();
  Uri _http = Uri.parse(config.baseUrl!);
  final response = await httpClients.postUrl(_http);
  int byteCount = 0;
  var request = MultipartRequest("POST", _http);
  Map<String, String> body = {};

  if (config.body is Map) {
    body = MapBuilder.build(config.body);
    request.fields.addAll(body);
  }

  for (int counterfile = 0; counterfile < (config.file?.path ?? []).length; counterfile++) {
    if (config.file!.path[counterfile] == '' || config.file!.path[counterfile] == 'null') {
      request.fields[config.file!.requestName[counterfile]] = 'null';
    } else {
      request.files.add(await MultipartFile.fromPath(config.file!.requestName[counterfile], config.file!.path[counterfile], contentType: MediaType('application', config.file!.path[counterfile].split('.').last)));
    }
  }

  Stream<List<int>>? streamUpload;
  request.headers.addAll(config.header!);
  if (onProgress != null) {
    var msStream = request.finalize();
    var totalByteLength = request.contentLength;
    if (config.debug ?? false) {}
    String decodes = request.headers[HttpHeaders.contentTypeHeader] ?? '';
    config.header?.forEach((key, value) {
      if (response.headers.value(key) == null) {
        response.headers.add(key, value);
      }
    });
    response.headers.set(HttpHeaders.contentTypeHeader, {decodes});

    getSize('Header ', response.headers.toString(), debug: config.debug ?? false);
    streamUpload = msStream.transform(
      StreamTransformer.fromHandlers(
        handleData: (data, sink) {
          sink.add(data);

          byteCount += data.length;
          onProgress(byteCount, totalByteLength);
        },
        handleError: (error, stack, sink) {
          throw error;
        },
        handleDone: (sink) {
          sink.close();
        },
      ),
    );

    await response.addStream(streamUpload);
    final res = await response.close();
    final getResponse = await readResponseAsString(res);

    return Response(getResponse, res.statusCode);
  } else {
    request.headers['content-type'] = 'multipart/form-data';
    final getResponse = await request.send();
    return Response(await getResponse.stream.bytesToString(), getResponse.statusCode);
  }
}