Делайте вещи с несколькими файлами при их загрузке с помощью node-formidable с Express

загрузка файлов с node-formidable на Express так же просто, как это

app.post('/upload', function(req, res) {
    // do something with req.files
});

файлы теперь сохраняются

форма: (multiple= "multiple" - это функция HTML5, которая позволяет пользователям выбирать несколько файлов для загрузки)

<form method="post" enctype="multipart/form-data" action="upload">
    <input type="text" name="title"/>
    <input type="file" name="upload" multiple="multiple"/>
    <input type="submit" value="upload" id="s3form_submit"/>
</form>

Если я добавлю эту строку в код загрузки

console.log(req.files.upload.path);

при загрузке одного файла путь отображается в консоли. Но когда я загружаю более одного файла, он просто говорит undefined в консоли. Как сделать журнал для каждого файла? Используя цикл for?

Грозный пример узла на GitHub регистрирует каждый файл при загрузке нескольких:https://github.com/felixge/node-formidable/blob/master/example/upload.js (я пытался использовать этот код в Express, не работал) Он делает именно то, что я хочу, но как это сделать в экспресс-приложении?

2 ответов


он работает, перемещая строку ниже в нижней части приложения.настройка функции. Прочитала о важности того, относительно middleware в излагать здесь: http://expressjs.com/guide.html#middleware

app.use(express.bodyParser({ uploadDir:__dirname + '/public/uploads' }));

и с помощью этого обработчика:

app.post('/upload', function(req, res){
    var form = new formidable.IncomingForm(),
    files = [],
    fields = [];
    form.on('field', function(field, value) {
        fields.push([field, value]);
    })
    form.on('file', function(field, file) {
        console.log(file.name);
        files.push([field, file]);
    })
    form.on('end', function() {
        console.log('done');
        res.redirect('/forms');
    });
    form.parse(req);
});

Спасибо, Райан!


так req.files может быть массивом. Попробуйте сделать console.log(req.files) в обработчике и посмотреть, как это выглядит... Но я думаю, что вам лучше просто сделать это, как в их примере. Вы можете заставить его работать, просто удалив ../test/common требовать вверху и изменять константы на статические значения (например, вместо TEST_TMP использовать __dirname + '/uploads').

обработчик:

var form = new formidable.IncomingForm(),
    files = [],
    fields = [];

form.uploadDir = __dirname + '/uploads';

form
  .on('field', function(field, value) {
    console.log(field, value);
    fields.push([field, value]);
  })
  .on('file', function(field, file) {
    console.log(field, file);
    files.push([field, file]);
  })
  .on('end', function() {
    console.log('-> upload done');
    res.writeHead(200, {'content-type': 'text/plain'});
    res.write('received fields:\n\n '+util.inspect(fields));
    res.write('\n\n');
    res.end('received files:\n\n '+util.inspect(files));
  });
form.parse(req);

файлы в __dirname + '/uploads' named согласно выходу на консоли (и к ответу, как вы можете видеть в end обработчик).