Я создал сервер Node JS, который выполняет следующие действия:
- Загружает медиафайлы (видео и изображения) на сервер с помощью multer
- Если медиафайлом является изображение, измените его размер, используя резкое изображение.
- Если медиа - это видео, измените его размер и сожмите с помощью fluent-ffmpeg.
- Загрузить файлы в хранилище Firebase для резервного копирования
Все это рабочее знаю бегло. Проблема в том, что при большом размере загружаемого файла обработка запроса занимает много времени. Итак, я хочу показать некоторый прогресс на стороне клиента, как показано ниже:
- Состояние 1. Медиа загружается -> n%
- Состояние 2. СМИ соглашаются
- Состояние 3. Медиа загружается в облако -> n%
- Состояние 4. Результат -> JSON = {status: "ok", uri: .., cloudURI: .., ..}
API хранилища Firebase имеет такую функциональность, когда мы создаем задачу загрузки, как показано ниже:
let uploadTask = imageRef.put(blob, { contentType: mime });
uploadTask.on('state_changed', (snapshot) => {
if (typeof snapshot.bytesTransferred == "number") {
let progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
console.log('Upload is ' + progress + '% done');
}
});
Я обнаружил, что это можно реализовать с помощью веб-сокетов, мне интересно, есть ли другие методы для этого.
Проблема также описана здесь: http://www.tugberkugurlu.com/archive/long-running-asynchronous-operations-displaying-their-events-and-progress-on-clients
И есть один из методов доступа к частичному ответу с помощью AJAX или WebSockets? Но ищу более гибкое и профессиональное решение.