base method

Future<String> base(
  1. SharedFile file, {
  2. bool? storeMode,
  3. ProgressListener? onProgress,
  4. CancelToken? cancelToken,
})

Make upload to /base endpoint

storeMode=null - auto store storeMode=true - store file storeMode=false - keep file for 24h in storage onProgress subscribe to progress event cancelToken make cancelable request

Implementation

Future<String> base(
  SharedFile file, {
  bool? storeMode,
  ProgressListener? onProgress,
  CancelToken? cancelToken,
}) async {
  final filename = file.name;
  final filesize = await file.length();

  ProgressEntity progress = ProgressEntity(0, filesize);

  final client =
      createMultipartRequest('POST', buildUri('$uploadUrl/base/'), false)
        ..fields.addAll({
          'UPLOADCARE_PUB_KEY': publicKey,
          'UPLOADCARE_STORE': resolveStoreModeParam(storeMode),
          if (options.useSignedUploads) ..._signUpload(),
        })
        ..files.add(
          MultipartFile(
            'file',
            file.openRead().transform(
                  StreamTransformer.fromHandlers(
                    handleData: (data, sink) {
                      final next = progress.copyWith(
                          uploaded: progress.uploaded + data.length);
                      final shouldCall = next.value > progress.value;
                      progress = next;

                      if (onProgress != null && shouldCall) {
                        onProgress(progress);
                      }
                      sink.add(data);
                    },
                    handleDone: (sink) => sink.close(),
                  ),
                ),
            filesize,
            filename: filename,
            contentType: MediaType.parse(
              lookupMimeType(filename.toLowerCase()) ?? '',
            ),
          ),
        );

  final completer = Completer<String>();
  if (cancelToken != null) {
    cancelToken.onCancel = _completeWithError(
      completer: completer,
      action: () => client.cancel(),
      cancelMessage: cancelToken.cancelMessage,
    );
  }

  // ignore: unawaited_futures
  resolveStreamedResponse(client.send())
      .then((data) => completer.complete(data['file'] as String))
      .catchError((e) {
    if (!completer.isCompleted) {
      completer.completeError(e);
    }
  });

  return completer.future;
}