upload static method

Future<void> upload({
  1. required String endpoint,
  2. required List<MultipartFile> files,
  3. required dynamic onSuccess(
    1. Response
    )?,
  4. required dynamic onError(
    1. Response
    )?,
  5. required VoidCallback onException,
  6. Map<String, dynamic>? fields,
  7. Map<String, String>? headers,
  8. Map<String, dynamic>? queryParams,
  9. String method = "POST",
  10. Duration timeout = const Duration(minutes: 5),
  11. void onProgress(
    1. int percent
    )?,
})

Implementation

static Future<void> upload({
  required String endpoint,
  required List<MultipartFile> files,
  required Function(Response)? onSuccess,
  required Function(Response)? onError,
  required VoidCallback onException,
  Map<String, dynamic>? fields,
  Map<String, String>? headers,
  Map<String, dynamic>? queryParams,
  String method = "POST",
  Duration timeout = const Duration(minutes: 5),
  void Function(int percent)? onProgress,
}) async {
  int lastPercent = -1;
  void report(int percent) {
    if (onProgress == null) return;
    final int p = percent.clamp(0, 100).toInt();
    if (p <= lastPercent) return;
    lastPercent = p;
    onProgress(p);
  }

  try {
    final MultipartRequest request = onProgress == null ? MultipartRequest(method, _buildUri(endpoint, queryParams)) : _UProgressMultipartRequest(method, _buildUri(endpoint, queryParams), report);
    request.headers.addAll(<String, String>{...?headers});
    if (fields != null) request.fields.addAll(removeNullEntries(fields)!.map((String key, dynamic value) => MapEntry<String, String>(key, value is String ? value : jsonEncode(value))));
    request.files.addAll(files);
    final Response response = await request.send().timeout(timeout).then(Response.fromStream);
    if (kDebugMode) response.prettyLog(params: jsonEncode(fields));
    if (response.statusCode >= 200 && response.statusCode < 300) {
      onSuccess?.call(response);
    } else {
      onError?.call(response);
    }
  } catch (e, stack) {
    onException();
    developer.log(e.toString(), stackTrace: stack);
  }
}