- Пользователь щелкает ссылку, которая должна начать загрузку файла.
- JS-клиент (угловой) отправляет AJAX-запрос на сервер.
- Сервер генерирует downloadId, помещает в клиентсеанс (на стороне сервера) {downloadInfo: {downloadId: 123, status: ID_REQUESTED}} и отвечает с помощью downloadId.
- JS-клиент генерирует downloadUrl по downloadId и открывает его в новом окне / вкладке, так что браузерможно начать загрузку.
5 & 6 одновременно:
5.1.JS-клиент уведомляет пользователя каким-то информационным сообщением «Сохранить файл где-нибудь».
5.2.JS-клиент отправляет AJAX-запрос на сервер GET /download/status/?waitForCompletion=yes&timeout=10000'.
5.3.Сервер просматривает сеанс пользователя для downloadId, получает его статус и возвращает статус на сервер.Если waitForCompletion = yes, то сервер ожидает завершения загрузки, но не более, чем через миллисекунды.
6.1.Пользователь нажимает сохранить файл, браузер отправляет запрос на загрузку URL ('GET / download / data /')
6.2.Сервер изменяет downloadInfo в пользовательском сеансе '{downloadInfo: {status: IN_PROGRESS}' 'и начинает загрузку
6.3.Когда загрузка завершится, сервер изменит downloadInfo на «{status: COMPLETED}»
5.4.JS-клиент в ответ на 'GET / download / status / retrieve status' COMPLETED '
Приведенная выше версия предназначена для однократной загрузки, новая загрузка переопределяет downloadInfo, и сеанс на стороне сервера не загрязняется устаревшими загрузками.Если приложение должно разрешать одновременную загрузку нескольких файлов (и знать статус каждого), удалите статусы downloadId по таймауту:
- keep lastAccessTime: 'downloadInfo: {downloadId123: {status: ID_REQUESTED, lastAcccessTime:123456789123456789}, downlaodId124: {...}} '
- в какой-то момент удаляет устаревшие элементы, например, когда сервер обращается к downloadInfo для пользователя.