base method
Future<String>
base(
- UCFile file, {
- bool? storeMode,
- ProgressListener? onProgress,
- CancelToken? cancelToken,
- Map<
String, String> ? metadata,
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(
UCFile file, {
bool? storeMode,
ProgressListener? onProgress,
CancelToken? cancelToken,
/// **Since v0.7**
Map<String, String>? metadata,
}) async {
_ensureRightVersionForMetadata(metadata);
final filename = file.name;
final filesize = await file.length();
metadata ??= {};
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(),
for (MapEntry entry in metadata.entries)
'metadata[${entry.key}]': entry.value,
})
..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;
}