Ниже приведен фрагмент кода, который вызывает функцию ниже. Это процесс, который позволяет людям перетаскивать файлы из системы на сайт. Он отображает список всех файлов с индикатором выполнения по мере их загрузки. В большинстве случаев он работает нормально, но при большом количестве файлов у меня возникают проблемы. У меня есть тестовый каталог, который я загружаю, который содержит более 100 файлов. Первые загружаемые файлы довольно малы, поэтому кажется, что они загружаются до того, как настраивается наблюдаемое, потому что индикатор выполнения не показывает никакого прогресса, а forkJoin не завершается, но если я смотрю на систему, файлы фактически загружен.
Правильно ли настроен объект? Есть ли лучший способ отслеживать прогресс загружаемых файлов? Любая помощь будет оценена.
if (this.files.size > 0) {
this.progress = await this.uploadService.dndUpload(
this.files, this.currentDir, this.currentProject, timestamp
);
let allProgressObservables = [];
for (let key in this.progress) {
allProgressObservables.push(this.progress[key].progress);
}
this.sfUploadSnackbar.openSnackbar(this.files, this.progress);
forkJoin(allProgressObservables).subscribe(async end => {
this.sfUploadSnackbar.closeSnackbar();
this.uploadService.clearUploadDir(this.currentProject, timestamp)
.subscribe();
this.uploadInProgress = false;
this.getFiles();
});
}
async dndUpload(files: Set<any>, dir: string, projectId: number, timestamp: number) {
const status: { [key: string]: { progress: Observable<number> } } = {};
for (let it = files.values(), file = null; file = it.next().value;) {
let params = new HttpParams()
.set('dir', dir)
.set('path', file.fullPath.replace(file.name,''))
.set('projectId', projectId.toString())
.set('timestamp', timestamp.toString());
let f: File = await new Promise((resolve, reject) => file.file(resolve, reject))
const formData: FormData = new FormData();
formData.append('file', f, f.name);
const req = new HttpRequest('POST', '/api/dndUpload', formData, {
reportProgress: true, params
});
const progress = new Subject<number>();
status[file.name] = {
progress: progress.asObservable()
};
this.http.request(req).subscribe(event => {
if (event.type === HttpEventType.UploadProgress) {
const percentDone = Math.round(100 * event.loaded / event.total);
progress.next(percentDone);
} else if (event instanceof HttpResponse) {
progress.complete();
}
});
}
return status;
}