uploadMedia method
ProgressTracker<Uri>
uploadMedia(
- dynamic file,
- MediaContentType<
Object> contentType, { - dynamic mediaType,
- String? mediaId,
- ProgressTracker<
Uri> ? progress, - bool isDebug = false,
override
Implementation
@override
ProgressTracker<Uri> uploadMedia(
final dynamic file, MediaContentType contentType,
{mediaType,
String? mediaId,
ProgressTracker<Uri>? progress,
bool isDebug = false}) {
var pfile = PFile.of(file);
final _progress = progress ?? ProgressTracker<Uri>.ratio();
// Check to see if file already exists first.
uploads
.findMedia(
mediaType: contentType.name,
filePath: pfile!.name!,
fileSize: pfile.size,
)
.catchError((err) {
print("No existing media found for ${pfile.name}");
return null;
}).then((existing) {
if (existing != null) {
var parsedExisting = Uri.tryParse(existing);
if (parsedExisting != null) {
print("Found existing media${pfile.name}");
_progress.complete(parsedExisting);
return;
}
}
Supervisor.create(UploadLargeFile(), isProduction: isDebug != true)
.then((supervisor) async {
final keyName =
(await getMediaPath(contentType, mediaId!, mediaType: mediaType))
.substring(1);
final mediaUrl =
await getMediaUri(contentType, mediaId, mediaType: mediaType);
String? freshToken;
if (this.authTokenGenerator != null) {
freshToken = await this.authTokenGenerator!();
}
try {
await supervisor.start(
timeout: 20.seconds,
params: UploadFileParams.ofPFile(
file: pfile,
keyName: keyName,
apiBasePath: baseUrl,
mediaType: contentType.fileType,
mediaUrl: mediaUrl.toString(),
apiToken: freshToken,
));
} on TimeoutException {
_progress.completeError(
"Main thread timed out waiting for supervisor to start");
supervisor.close().timeout(20.seconds);
return;
} catch (error, stack) {
log.severe(
"Main thread error getting start signal: $error", error, stack);
rethrow;
}
StreamSubscription? _sub;
_sub = supervisor.onStatus.listen((event) async {
log.info(
"STATUS CHANGE: ${event.phase} ${event.percentComplete}% complete");
switch (event.phase) {
case WorkPhase.error:
_progress.completeError(event.error);
_sub?.cancel();
break;
case WorkPhase.stopped:
_progress.complete(await getMediaUri(contentType, mediaId,
mediaType: mediaType));
_sub?.cancel();
break;
default:
_progress.update(event.percentComplete ?? 0, total: 100.0);
}
}, cancelOnError: false);
});
});
return _progress;
}