node.js flatiron - загрузка файлов по multipart/form-data

У меня есть приложение flatiron, которое теперь необходимо расширить, чтобы обрабатывать загрузку изображений из нескольких частей / данных формы.

Как можно обрабатывать загрузку файлов в приложении flatiron? union / Director, кажется, игнорирует multipart / form-data, и все мои попытки интегрировать грозный объект потерпели неудачу - я предполагаю, что это из-за действий, которые выполняет союз до того, как грозный объект захватит объект запроса.

Я пробовал нормально и streaming: true маршруты, а также обработка сырья в before массив.

Я не могу быть единственным человеком, который нуждается в этом, поэтому, вероятно, к нему обращаются и я прошу прощения. Я просто не могу найти никаких справочных материалов.

2 ответа

Решение

Вы можете использовать union с connect.multipart (или bodyParser), который уже использует node-formidable.

var connect = require('connect'),
    union = require('union');


var server = union.createServer({
  buffer: false,
  before: [
    connect.bodyParser(),
    function(req, res) {
                if (req.method==='POST'){
                        console.log(req.files);
                        res.end('Done');
                }else{
                        res.writeHead(200, { 'Content-Type': 'text/html' });
                        res.end('<form method="post" enctype="multipart/form-data">' +
                                '<input type="file" name="file" />' +
                                '<input type="submit" value="Upload" />' +
                                '</form>');
                }
    },
  ]
}).listen(8000);

По-видимому, вам нужно отключить буферизацию в настройках объединения, а потоковую передачу - true в настройках вашей конечной точки:

var fs = require('fs'),
    path = require('path'),
    union = require('../../lib'),
    director = require('director'),
    favicon = require('./middleware/favicon'),

    // for uploading:
    formidable = require('formidable'),
    util = require('util');

var router = new director.http.Router();

var server = union.createServer({
  buffer: false,
  before: [
    favicon(path.join(__dirname, 'favicon.png')),
    function (req, res) {
      var found = router.dispatch(req, res);
      if (!found) {
        res.emit('next');
      }
    }
  ]
});

router.get('/foo', function () {
  this.res.writeHead(200, { 'Content-Type': 'text/html' });
  this.res.end('<form action="/foo" enctype="multipart/form-data" method="post">'+
    '<input type="text" name="title"><br>'+
    '<input type="file" name="upload" multiple="multiple"><br>'+
    '<input type="submit" value="Upload">'+
    '</form>');
});

router.post('/foo', { stream: true }, function () {
  var req = this.req,
      res = this.res,
      writeStream;

      var form = new formidable.IncomingForm();

      console.log('Receiving file upload');

      form
        .on('field', function(field, value) {
          console.log(field, value);
        })
        .on('file', function(field, file) {
          console.log(field, file);
        })
        .on('progress', function(rec, expected) {
          console.log("progress: " + rec + " of " +expected);
        })

        .parse(req, function(err, fields, files) {

          console.log('Parsed file upload' + err);

          res.writeHead(200, { 'Content-Type': 'text/plain' });
          if (err) {
            res.end('error: Upload failed: ' + err);
          }
          else {
            res.end('success: Uploaded file(s): ' + util.inspect({fields: fields, files: files}));
          }
        });

});

server.listen(9090);
console.log('union with director running on 9090');
Другие вопросы по тегам