Multer - req.file всегда undefined

Я рассмотрел много ответов на этот же вопрос, но пока не нашел рабочего решения. Я пытаюсь сделать веб-приложение, чтобы вы могли загружать файлы с помощью express и multer, и у меня возникла проблема с тем, что файлы не загружаются, а req.file всегда undefined.

Мой код ниже

'use strict';

var express = require('express');
var path    = require('path');
var multer  = require('multer')
var upload  = multer({ dest: 'uploads/' })

var app = express();
require('dotenv').load();

app.use(express.static(path.join(__dirname, 'main')));

app.post('/upload', upload.single('upl'), function (req, res, next) {
  // req.file is the `avatar` file
  // req.body will hold the text fields, if there were any
  console.log(req.file);
  res.status(204).end();
})

var port = process.env.PORT || 8080;
app.listen(port,  function () {
    console.log('Node.js listening on port ' + port + '...');
});

Форма

    <form class="uploadForm" action="/upload" method="post" enctype="multipart/formdata">
        <label class="control-label">Select File</label>
        <input name="upl" id="input-1" type="file" class="file">
        <input type="submit" value="submit" />
    </form>

Помогите очень ценить, это сводит меня с ума.

Ответ 1

Ваш enctype немного некорректен, он должен быть multipart/form-data вместо multipart/formdata.

Ответ 2

В случае почтальона, попробуйте следующее:

  • Закройте вкладку почтальона для API
  • Откройте новую вкладку снова
  • Перестройте запрос API и отправьте его.

Это может решить проблему. Каждый раз, когда вы перезапускаете сервер, вам нужно сделать выше шагов для повторного вызова API. Причина, по которой multer отправляет обратно куки, называемые connect.sid, клиенту, которые могут потребоваться при дальнейшей связи. Использование старых файлов cookie не будет загружать файл.

Ответ 3

Я положил MY (есть много, я представляю и, безусловно, лучше) решение, чтобы помочь многим людям, таким как я, потому что я искал в течение одного целого дня; - (


//JS file on node side

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);
})

Ответ 4

HTML файл,

<form class="uploadForm" action="/upload" method="post" enctype="multipart/form-data">
    <label class="control-label">Select File</label>
    <input name="upl" id="input-1" type="file" class="file">
    <input type="submit" value="submit" />
</form>

app.js

var express=require("express");
var multer=require("multer");
var app=express();
var upload=multer({dest:"uploads/"});
app.post("/upload",upload.single("upl"),function(req,res){
console.log("Uploaded Successfull with filename : "+req.upl.filename);
});

Ответ 5

Да, ваш enctype ошибочен, и это единственная проблема. Убедитесь, что вы исправили свой enctype, иначе вы, скорее всего, получите undefined в req.file или req.files.