uploadFile method

Future<Response> uploadFile(
  1. String fileKey,
  2. String? filePath, {
  3. String? blobName,
  4. List<int>? blobData,
  5. String? url,
  6. IsolateModel? isolateModel,
  7. StreamTransformer<List<int>, String>? decoder,
  8. dynamic onProgress(
    1. int bytes,
    2. int totalBytes
    )?,
  9. dynamic cancelToken(
    1. Function c
    )?,
  10. OnTimeout? onTimeout,
  11. Duration? timeLimit,
})

This will use filePath if blobData is null.

Implementation

Future<Response> uploadFile(String fileKey, String? filePath,
    {String? blobName,
    List<int>? blobData,
    String? url,
    IsolateModel? isolateModel,
    StreamTransformer<List<int>, String>? decoder,
    Function(int bytes, int totalBytes)? onProgress,
    Function(Function c)? cancelToken,
    OnTimeout? onTimeout,
    Duration? timeLimit}) async {
  // if (await isConnected())

  if (client == null) client = http.Client();
  if (timeLimit == null) timeLimit = config.uploadTimeout;

  var request = isolateModel!.request;
  var req = FileRequest(request.method.value, Uri.parse(url ?? config.url),
      (bytes, totalBytes) {
    _print('Upload progress : ' + (bytes / totalBytes).toString());
    if (onProgress != null) onProgress(bytes, totalBytes);
  });
  if (blobData != null) {
    req.files.add(http.MultipartFile.fromBytes(fileKey, blobData,
        contentType: MediaType('application', 'octet-stream'),
        filename: blobName));
  } else {
    req.files.add(await http.MultipartFile.fromPath(fileKey, filePath!));
  }

  Crypto crypto = Crypto(config.secretKey, config.publicKey);

  String requestMessage = _prepareRequestMessage(crypto, isolateModel);

  req.fields[isolateModel.requestParamName] = requestMessage;
  req.fields['os'] = _getOS();

//      cancelToken?.throwIfCancellationRequested();
//      var res = await RetryHelper.tryRun<http.StreamedResponse>(() {
//        return CancellationTokenSource.register(cancelToken, req.send());
//      }, cancelToken: cancelToken);
  if (cancelToken != null) cancelToken(req.close);

  var res = await req.send().timeout(timeLimit, onTimeout: onTimeout);

  // if (res != null) {
  if (res.statusCode == 200) {
    var responseBody = await res.stream.bytesToString();
    var responseMessage = responseBody;
    _print('raw response : ' + responseMessage);

    responseMessage = _decrypt(crypto, isolateModel, responseMessage);

    try {
      var jsonResponse = convert.jsonDecode(responseMessage);
      _print('json decoded : ' + jsonResponse.toString());
      return Response(
        responseBody,
        res.statusCode,
        result: jsonResponse,
        state: ResponseState.SUCCESS,
      );
    } catch (e) {
      _print('json decoded exception : ' + e.toString());
      return Response(
        responseBody,
        res.statusCode,
        result: null,
        state: ResponseState.UNEXPECTED,
      );
    }
//        res.stream
//            .transform(decoder ?? convert.utf8.decoder)
//            .listen((responseBody) {
//          var responseMessage = responseBody;
//
//
//        });
  } else {
    // error
    _print(res.statusCode.toString() + ' ' + res.reasonPhrase!);
    return Response(res.reasonPhrase, res.statusCode,
        result: null, state: ResponseState.ERROR);
  }
  // } else {
  //   _print('http response is null!');
  //   return Response('http response is null!', -1,
  //       result: null, state: ResponseState.ERROR);
  // }

  // else {
  //   return Response('Check your network connection!', -1,
  //       result: null, state: ResponseState.NETWORK_CONNECTION);
  // }
}