uploadFileWith function
Stream<AnonFileUploadEvent>
uploadFileWith({
- required String endpoint,
- required Stream<
Uint8List> byteStream, - required String filename,
- required int length,
- MultipartRequestClient? multipartRequestClient,
- AnonFileUploadResponse? mapResponseJson()?,
Help function that actually uploads the file bytes
with a given filename
using a multipartRequestClient
provider to a given AnonFiles endpoint
.
Implementation
Stream<AnonFileUploadEvent> uploadFileWith({
required String endpoint,
required Stream<Uint8List> byteStream,
required String filename,
required int length,
MultipartRequestClient? multipartRequestClient,
AnonFileUploadResponse? Function(Map<String, dynamic>)? mapResponseJson,
}) {
final MultipartRequestClient sendMultipartRequest =
multipartRequestClient ?? sendMultipartRequestTo;
late final StreamController<AnonFileUploadEvent> controller;
Stream<AnonFileUploadEvent> upload() async* {
yield const AnonFileUploadEvent(
progress: 0,
response: null,
);
final Uint8List raw = await sendMultipartRequest(
endpoint,
byteStream,
length,
filename: filename,
).reduce(
(Uint8List previous, Uint8List element) => Uint8List.fromList(
<int>[...previous, ...element],
),
);
final Map<String, dynamic> response =
jsonDecode(utf8.decode(raw)) as Map<String, dynamic>;
yield AnonFileUploadEvent(
progress: 1,
response: mapResponseJson?.call(response) ??
AnonFileUploadResponse.fromJson(response),
);
}
FutureOr<void> onCancel() {}
Future<void> onListen() async {
await controller.addStream(upload());
await controller.close();
}
void onPause() {
throw UnsupportedError(
'Resume and cancel are not supported when uploading a file.',
);
}
void onResume() {
throw UnsupportedError(
'Resume and cancel are not supported when uploading a file.',
);
}
controller = StreamController<AnonFileUploadEvent>(
onCancel: onCancel,
onListen: onListen,
onPause: onPause,
onResume: onResume,
);
return controller.stream;
}