Задать вопрос
Sanu0074
@Sanu0074

Как реализовать загрузку файлов на сервер с прогресс-баром?

Есть nodejs-приложение с express 4.x. Примерно так в данный момент я осуществляю загрузку файлов из формы на сервер:

var express = require("express");
    var router = express.Router();
    var multipart = require("connect-multiparty");
    var multipartMiddleware = multipart();
    var ResourcesController = require("src/resources/resourcesController");
    
    router.post("/saveResource", multipartMiddleware, function(req, res) {
    	var instance = new ResourcesController(res,req);
    	instance.saveResource();
    });
    
    module.exports = router;


Благодаря connect-multiparty, можно получить в req.files переданные файлы и дальше уже что-то с ними делать.

Но, я хочу показывать пользователю прогресс загрузки файлов на сервер, для этого я буду использовать сокеты. Например, когда срабатывает router.post("/saveResource" ... сервер эмитит событие с инфой, клиент соответственно ее красиво рисует. Вот на этом шаге я и споткнулся, т.к. то что попадает в req.files - это уже загружено во временную папку на сервере, а мне нужно как-то перехватить эти файлы на этапе загрузки на сервер, сделать ReadStream и в .on('data') посредством сокета эмитить событие с инфой клиенту. Как это сделать, пока не разобрался, может есть что-то типа connect-multiparty но с возможностью выводить прогресс в stream или какой либо другой способ?
  • Вопрос задан
  • 1526 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
mannaro
@mannaro
Умею профессионально гуглить
Попробуйте заюзать более низкоуровневую библиотеку, на которой базируется connect-multiparty. Там как-раз есть progress :)

https://github.com/andrewrk/node-multiparty

var form = new multiparty.Form();
form.on('progress', function(bytesReceived, bytesExpected) {
   socket.emit('received', (bytesReceived / bytesExpected).toFixed(2) * 100);
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Sivkoff
@Sivkoff
Web Developer
Около года назад выполнял подобную задачу, правда Node была версии 0.12.
Использовал socket-io.stream и progress-stream, работало прекрасно. Правда у меня стояла задача потоковой передачи файла из браузера одного пользователя, в браузер другого с индикацией прогресса на обеих сторонах. Но думаю вам тоже должно подойти.
Ответ написан
@Nc_Soft
Почему не сделать это через nginx?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы