Node.js - expressjs - multer req.files выводит пустые

я использую multer, чтобы получить файл из этой формы

<form action="/api/pimage" method="POST" enctype="multipart/form-data">
    <fieldset>
        <input type="file" name="profileimage">
        <input type="submit">
    </fieldset>
</form>

используя этот серверный скрипт

app.post('/api/pimage', function(req, res, next) {
    console.log(req.body, req.files);
});

проблема в том, что req.body распечатывает {profileimage: 'image.png'}, а req.files распечатывает {}, где вы видите проблему? спасибо

P.S. я использую app.use(bodyParser.urlencoded({ extended: false })); для получения req.body и app.use(multer({ dest: './uploads/'})); для req.files


person iJumbo    schedule 18.11.2014    source источник
comment
Существует ли каталог uploads и доступен ли он для записи?   -  person Ben Fortune    schedule 18.11.2014
comment
Каталог автоматически создается multer при запуске   -  person iJumbo    schedule 18.11.2014
comment
Если вы видите req.body.profileimage, значит, ваш запрос каким-то образом не отправляется как multipart/form-data. Это то, что вы увидите, когда Content-Type станет application/x-www-form-urlencoded. Можете ли вы поместить console.dir(req.headers['content-type']) в свой обработчик app.post()?   -  person mscdex    schedule 18.11.2014
comment
Да, вы правы, распечатывает «application/x-www-form-urlencoded», а не multipart/form-data   -  person iJumbo    schedule 18.11.2014


Ответы (3)


Я обнаружил, что использование multer вместе с bodyParser может привести к тому, что req.file не будет определено. Обязательно проверьте это также, если у вас возникли проблемы.

person nikk wong    schedule 07.06.2016

Я поместил МОЁ (я думаю много и, конечно, лучше) решение, чтобы помочь многим таким людям, как я, потому что я искал в течение всего 1 дня ;-(


var express = require('express');
var fileUpload = require('express-fileupload');
var fs = require("fs");
var app = express();

console.log('étape 0');

app.use(express.static('mesStatic'));
app.use(fileUpload());

console.log('étape 1');

app.get('/indexFileUpload.htm', function (req, res) {
   res.sendFile( __dirname + "/" + "indexFileUpload.htm" );
})

console.log('étape 2');

app.post('/file_upload', function (req, res) {

   console.log('étape 3');
   console.log('req.files:' , req.files);

   if (!req.files) {
       res.send('No files to upload.');
       return;
   }

   console.log('req.files.file.data:' , req.files.file.data);
   var bufDataFile = new Buffer(req.files.file.data, "utf-8");
   console.log('étape 3.1');
   console.log('__dirname : ' + __dirname);

   fs.writeFile(__dirname + '/file_upload/output.txt', bufDataFile,  function(err) {
      if (err) {
         return console.error(err);
      }
      else {
         console.log("Data written successfully !");
      }      
      console.log('étape 4');
      res.end('Fin OK !!!');  
   })
})
var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port

   console.log("Example app listening at http://%s:%s", host, port);
})
person Arnaud BOURET    schedule 05.11.2016

Вы должны указать свою функцию загрузки, определенную для multer, прежде чем запрашивать req.file в function(req, res), вы можете следовать приведенному ниже коду.

    var Storage = multer.diskStorage({
        destination: function (req, file, callback) {
            callback(null, "./images/");
        },
        filename: function (req, file, callback) {
            callback(null, file.fieldname + '_' + Date.now() + '.jpg');
        }
    });
    var upload = multer({ storage: Storage }).single('imagePath');

    router.post('/file_upload', upload, function(req, res, next){
        console.log(req.file);
var Storage = multer.diskStorage({
    destination: function (req, file, callback) {
        callback(null, "./public/images/");
    },
    filename: function (req, file, callback) {
        callback(null, file.fieldname + '_' + Date.now() + '.jpg');
    }
});
var upload = multer({ storage: Storage }).single('imagePath');

router.post('/add-product', upload, function(req, res, next){
    var newProduct = new Product();
}
person Abhishek Rathore    schedule 27.07.2017