Загрузка файлов с помощью Express 4.0: req.файлы не определены



Я пытаюсь получить простой механизм загрузки файлов, работающий с Express 4.0, но я продолжаю получать undefined на req.files на app.post тело. Вот соответствующий код:



var bodyParser = require('body-parser');
var methodOverride = require('method-override');
//...
app.use(bodyParser({ uploadDir: path.join(__dirname, 'files'), keepExtensions: true }));
app.use(methodOverride());
//...
app.post('/fileupload', function (req, res) {
console.log(req.files);
res.send('ok');
});


.. и сопутствующий Нефритовый код:



form(name="uploader", action="/fileupload", method="post", enctype="multipart/form-data")
input(type="file", name="file", id="file")
input(type="submit", value="Upload")


решение

Благодаря ответу от mscdex ниже, я переключился на использование busboy вместо bodyParser:



var fs = require('fs');
var busboy = require('connect-busboy');
//...
app.use(busboy());
//...
app.post('/fileupload', function(req, res) {
var fstream;
req.pipe(req.busboy);
req.busboy.on('file', function (fieldname, file, filename) {
console.log("Uploading: " + filename);
fstream = fs.createWriteStream(__dirname + '/files/' + filename);
file.pipe(fstream);
fstream.on('close', function () {
res.redirect('back');
});
});
});
990   6  

6 ответов:

The body-parser модуль обрабатывает только JSON и urlencoded формы представления, а не multipart (что было бы в случае, если вы загружаете файлы).

для multipart, вам нужно будет использовать что-то вроде connect-busboy или multer или connect-multiparty (multiparty / formidable-это то, что первоначально использовалось в промежуточном программном обеспечении express bodyParser). Также FWIW, я работаю над еще более высоким уровнем слоя поверх busboy называется reformed. Он поставляется с Экспресс-middleware, а также может использоваться отдельно.

вот что я нашел в гугле:

var fileupload = require("express-fileupload");

который является довольно простым механизмом для загрузки

app.post("/upload", function(req, res)
{
    var file;

    if(!req.files)
    {
        res.send("File was not found");
        return;
    }

    file = req.files.FormFieldName;  // here is the field name of the form

    file.mv("file.txt", function(err)  //Obvious Move function
        {
              // log your error
        });

    res.send("File Uploaded");


});

похоже body-parserсделал поддержка загрузки файлов в Express 3, но поддержка была удалена для Express 4, когда он больше не входит подключение как зависимость

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

console.log(req.files) используя body-parser (Express 3) выведите объект, который выглядел так:

{ file: 
   { fieldName: 'file',
     originalFilename: '360px-Cute_Monkey_cropped.jpg',
     name: '360px-Cute_Monkey_cropped.jpg'
     path: 'uploads/6323-16v7rc.jpg',
     type: 'image/jpeg',
     headers: 
      { 'content-disposition': 'form-data; name="file"; filename="360px-Cute_Monkey_cropped.jpg"',
        'content-type': 'image/jpeg' },
     ws: 
      WriteStream { /* ... */ },
     size: 48614 } }

по сравнению с console.log(req.files) используя экспресс-помощника (Экспресс-4):

{ file: 
   { field: 'file',
     filename: '360px-Cute_Monkey_cropped.jpg',
     file: 'uploads/9749a8b6-f9cc-40a9-86f1-337a46e16e44/file/360px-Cute_Monkey_cropped.jpg',
     mimetype: 'image/jpeg',
     encoding: '7bit',
     truncated: false
     uuid: '9749a8b6-f9cc-40a9-86f1-337a46e16e44' } }

мултэр это промежуточное программное обеспечение, которое обрабатывает "multipart / form-data" и волшебно & делает загруженные файлы и данные формы доступными для нас в запросе как запрос.файлы и запрос.тело.

установка multer : -npm install multer --save

in .html файл: -

<form method="post" enctype="multipart/form-data" action="/upload">
    <input type="hidden" name="msgtype" value="2"/>
    <input type="file" name="avatar" />
    <input type="submit" value="Upload" />
</form>

in .файл JS:-

var express = require('express');
var multer = require('multer');
var app = express();
var server = require('http').createServer(app);
var port = process.env.PORT || 3000;
var upload = multer({ dest: 'uploads/' });

app.use(function (req, res, next) {
  console.log(req.files); // JSON Object
  next();
});

server.listen(port, function () {
  console.log('Server successfully running at:-', port);
});

app.get('/', function(req, res) {
  res.sendFile(__dirname + '/public/file-upload.html');
})

app.post('/upload', upload.single('avatar'),  function(req, res) {
  console.log(req.files); // JSON Object
});

надеюсь, что это помогает!

ПРОБЛЕМА РЕШЕНА !!!!!!!

получается storage функция не выполнялась ни разу. потому что я должен был включить app.use(upload) как upload = multer({storage}).single('file');

 let storage = multer.diskStorage({
        destination: function (req, file, cb) {
            cb(null, './storage')
          },
          filename: function (req, file, cb) {
            console.log(file) // this didn't print anything out so i assumed it was never excuted
            cb(null, file.fieldname + '-' + Date.now())
          }
    });

    const upload = multer({storage}).single('file');

express-fileupload похоже, единственное промежуточное ПО, который все еще работает в эти дни.

С тем же примером, multer и connect-multiparty дает неопределенное значение req.файл или req.файлы, а express-fileupload строительство.

и есть много вопросов и проблем, связанных с пустым значением req.файл/Треб.файлы.

Comments

    Ничего не найдено.