Valums file-uploader на nodejs - множественная загрузка файла

Я использую valums ajax file-uploader

Моя сторона узла nodejs выглядит следующим образом:

fileStream = fs.createWriteStream(__dirname+'/../public/images/houses/'+rndname);
req.pipe(fileStream);
req.on('end', function() {
  body = '{"success":"true", "name": "'+rndname+'"}';
  res.writeHead(200, 
    { 'Content-Type':'text/plain'
    , 'Content-Length':body.length
    });
  res.end(body);
});

клиентская сторона:

        function createUploader(){            
        var uploader = new qq.FileUploader({
            element: document.getElementById('homepic'),
            action: '/server/upload',
            allowedExtensions: ['jpg', 'png', 'gif'],
            multiple:true,
            onComplete: function(id, fileName, responseJSON){
              $("#homepic").append("<img src='/images/houses/"+responseJSON.name+"' class='mediumpic' />  ");
            }
        });           
    }
window.onload = createUploader;

Это все работает для загрузки одного файла просто отлично!

Итак, представьте - я нажимаю кнопку загрузки, выбираю pic, он загружается очень быстро, появляется на экране. Теперь я хочу загрузить еще один. Я выбираю pic, он быстро загружается на сервер (я вижу его на сервере), я возвращаю ответ нового имени файла и успеха, я помещаю картинку на экран с моим добавлением. Но картина не появляется. Я пытаюсь открыть в новой вкладке только рис и все еще ничего, даже если я вижу это на сервере, стоящем в правильном каталоге. После 3-5 минут ожидания он просто появляется, даже если не требуется обновление страницы. Что вызывает такое поведение? Это трубопровод, и мне нужно позвонить Марио, чтобы исправить это или что-то еще?:)

Ответ 1

Изменен мой req.pipe для req.on('data'), и он начал работать. Как-то кажется, что мой req.pipe не закрыл соединение и "ожидал" большего количества данных, даже несмотря на то, что весь файл был загружен. Вот почему я не мог вызвать GET для записи, и он находился в состоянии ожидания. Это устранило мои проблемы:

req.on('data', function(data) { 
      ws.write(data); 
    }); 
    req.on('end', function(data) { 
      var body = '{"success":"true", "name": "'+rndname+'"}';
      res.writeHead(200, 
        { 'Content-Type':'text/plain'
        , 'Content-Length':body.length
        });
      res.end(body);
    }); 

Несмотря на то, что я нашел решение своей проблемы, если кто-нибудь знает, почему req.pipe не закрыл соединение и застрял в подвеске, как 2-3 минуты, пока не появилась фотография, сообщите мне.

Ответ 2

Я создал компонент промежуточного программного обеспечения Express 3.x, который позволяет вам загружать загруженные файлы valums/fineuploader через коллекцию req.files.

Все, что вам нужно сделать, это добавить промежуточное ПО во время конфигурации Express, например:

var fineuploaderExpressMiddleware = require('fineuploader-express-middleware');

app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(fineuploaderExpressMiddleware({ uploadDir: '/tmp ' }));

Компонент доступен здесь: https://github.com/suprememoocow/fineuploader-express-middleware