downloadUrl method

  1. @override
Future<bool> downloadUrl(
  1. String url,
  2. String saveName, {
  3. int timeout = 1800,
  4. void progressCallback(
    1. int loaded,
    2. int total
    )?,
})
override

Implementation

@override
Future<bool> downloadUrl(
  String url,
  String saveName, {
  int timeout = 1800,
  void Function(int loaded, int total)? progressCallback,
}) async {
  final completer = Completer<bool>();
  try {
    web.XMLHttpRequest request = web.XMLHttpRequest();
    request.open('GET', url, true);
    request.responseType = 'blob';
    request.onLoad.listen((event) {
      if (request.status == 200) {
        final blob = request.response as web.Blob;
        final url = web.URL.createObjectURL(blob);
        web.HTMLAnchorElement anchor = web.HTMLAnchorElement();
        anchor.href = url;
        anchor.style.display = 'none';
        anchor.download = saveName;
        anchor.target = '_blank';
        anchor.rel = 'noopener noreferrer';
        anchor.click();
        anchor.remove();
        web.URL.revokeObjectURL(url);
        if (!completer.isCompleted) completer.complete(true);
      } else {
        if (!completer.isCompleted) completer.complete(false);
      }
    });
    request.onError.listen((event) {
      if (!completer.isCompleted) completer.complete(false);
    });
    request.onProgress.listen((event) {
      if (event.lengthComputable && progressCallback != null) {
        // final percent = event.loaded / event.total * 100;
        progressCallback(event.loaded, event.total);
      }
    });
    request.send();
  } catch (err) {
    logger.severe('Error at StorageUtilImpl.downloadFile >>> $err');
    if (!completer.isCompleted) completer.complete(false);
  }
  return completer.future.timeout(Duration(seconds: timeout), onTimeout: () => false);
}