Слушатели событий в форме Express / Connect-Form не запускаются - PullRequest
3 голосов
/ 03 декабря 2011

Я недавно обновил свою среду до Node v0.6.3, и некоторые функции загрузки файлов, которые работали нормально до того, как перестали работать. Я отправляю форму загрузки файла на следующую страницу:

var fs = require('fs'),
    client = require('../app'),
    exec = require('child_process').exec,
    socket = require('../socket')

var supported = [ 'image/jpeg',
                  'image/pjpeg',
                  'image/bmp',
                  'image/gif',
                  'image/tiff',
                  'image/png']

var maxSize = 204800;

module.exports = function(req, res) {
  console.log(JSON.stringify(req.form));
  var tmpPath = '';
  req.form.on('fileBegin', function(err, fileInfo) {
    console.log('upload file begin')
    if (fileInfo.path) {tmpPath = fileInfo.path};
    socket.emit('attachment_upload_started', req.query.user, {friend: req.query.friend}, []);
  });

  req.form.on('progress', function(bytesReceived, bytesExpected) {
    var percent = (bytesReceived / bytesExpected * 100) | 0;
    socket.emit('attachment_progress', req.query.user, {progress: percent, friend: req.query.friend}, []);    
       var child = exec('file --mime-type ' + tmpPath, function (err, stdout, stderr) {
          var mimetype = stdout.substring(stdout.lastIndexOf(':') + 2, stdout.lastIndexOf('\n'));
          if (!err && mimetype && supported.indexOf(mimetype)==-1 && mimetype!='Can\'t read SAT') {
            socket.emit('attachment_error', req.query.user, {type: 'format', friend: req.query.friend}, []);
            req.connection.destroy();
            req.connection.resume = function(){};
            console.log(mimetype)
            console.log(err);
          }

          if (bytesExpected > maxSize) {
            socket.emit('attachment_error', req.query.user, {type: 'size', friend: req.query.friend}, []);
            req.connection.destroy();
            req.connection.resume = function(){}
          }
        });
      });

  req.form.complete(function(err, fields, files){
    console.log('form complete');
    if (!err) {
      if (supported.indexOf(files.upload.mime)==-1) {
        console.log(files.upload.mime);
        socket.emit('attachment_error', req.query.user, {type: 'format', friend: req.query.friend}, []);
      }
      else {
        socket.emit('attachment_complete', req.query.user, {friend: req.query.friend, file: files.upload}, []);
      }
    }
    else {
      console.log('err');
    }
    res.redirect('/iattachment?user='+req.query.user+'&friend='+req.query.friend);
  });
}

Файл действительно попадает в каталог my / tmp, но ни один из кодов в req.form.complete или req.form.on ('progress'), req.form.on ('fileBegin') слушателей казнят. Любая помощь будет оценена!

Ответы [ 2 ]

3 голосов
/ 03 декабря 2011

Вы используете express.bodyParser?

Проблема в том, что connect, модуль, на котором основан экспресс, теперь включает в себя огромную версию 2.0, но никто не удосужился изменить документацию или примеры.(На самом деле, позвольте мне сделать это прямо сейчас.)

Если вы уже используете bodyParser, временный файл уже создан, и так как запрос уже обработан и весь поток прочитан, ваш код недействительно что-то делает, и ждет ввода.

Проверьте "req.body", и он должен содержать всю информацию о файлах.В противном случае попробуйте удалить express.bodyParser.

0 голосов
/ 24 декабря 2011

Вам нужен bodyParser для анализа данных POST.

Попробуйте посмотреть на это http://senchalabs.github.com/connect/middleware-bodyParser.html

удалить express.bodyParser.parse ['multipart / form-data'];

Я пока не смог заставить это работать на моем конце. Я пытаюсь использовать формула напрямую, чтобы отправлять индикаторы выполнения. Но ничего не запускается вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...