uploadFile<T> method

Future<Map<String, dynamic>> uploadFile<T>({
  1. required String resourcePath,
  2. required dynamic data,
  3. dynamic onRes(
    1. Map<String, dynamic>
    )?,
})

Implementation

Future<Map<String, dynamic>> uploadFile<T>(
    {required String resourcePath,
    required dynamic data,
    Function(Map<String, dynamic>)? onRes}) async {
  var request = http.MultipartRequest("POST", Uri.parse(resourcePath));
  Map dataMap = data;
  for (var aKey in dataMap.keys) {
    if (dataMap[aKey] == null) continue;
    if (dataMap[aKey] is File) {
      File file = dataMap[aKey];
      request.files.add(await http.MultipartFile.fromPath(aKey, file.path));
      continue;
    }

    if (dataMap[aKey] is http.MultipartFile) {
      http.MultipartFile file = dataMap[aKey];
      request.files.add(file);
      continue;
    }

    '$aKey:${dataMap[aKey]}'.printXNetLog();
    request.fields[aKey] = dataMap[aKey];
  }
  formHeaders().forEach((key, value) {
    request.headers[key] = value!;
  });
  resourcePath.printXNetLog();

  final respData = <String, dynamic>{};
  await request.send().then((response) async {
    if (!((response.statusCode < 200) || (response.statusCode >= 300))) {
      return response.stream.toStringStream().listen((jsonResult) {
        Map<String, dynamic>? resultClass = jsonDecode(jsonResult);
        var result = {"succeed": true, "data": resultClass};
        if (onRes != null) onRes(result);
        return;
      });
    } else {
      var jsonResult = response.stream.toString();
      jsonResult.printXNetLog();
      var resultClass = {"succeed": false, "data": null};
      if (onRes != null) onRes(resultClass);
      return resultClass;
    }
  });
  return respData;
}