Express和Multer上传问题- req.files始终为空

6

我的表单处理程序处理req.files时,无论我尝试了哪种策略,都会返回空数组或对象。

而且,在multer内部,makemiddleware对象并不将我的文件字段视为文件。(尝试将其打印到控制台,但表单提交没有经过该处)。

我的客户端请求负载如下所示,服务端的 req.headers['content-type'] 打印出来是 multipart/form-data。

    ------WebKitFormBoundaryjcaOV7ABMw82oDRB
Content-Disposition: form-data; name="username"

Yash
------WebKitFormBoundaryjcaOV7ABMw82oDRB
Content-Disposition: form-data; name="email"

gnanajothi@gmail.com
------WebKitFormBoundaryjcaOV7ABMw82oDRB
Content-Disposition: form-data; name="password"

yash
------WebKitFormBoundaryjcaOV7ABMw82oDRB
Content-Disposition: form-data; name="confirmPassword"

yash
------WebKitFormBoundaryjcaOV7ABMw82oDRB
Content-Disposition: form-data; name="profilePicture"

[object FileList]
------WebKitFormBoundaryjcaOV7ABMw82oDRB--



 //Middleware

var uploadPath = path.join(__dirname, '../public/upload');
var upload = multer({
  dest: uploadPath,
  rename: function (fieldname, filename) {
      return filename.replace(/\W+/g, '-').toLowerCase() + Date.now();
  },
  onFileUploadStart: function (file) {
      console.log(file.fieldname + ' is starting ...');
  },
  onFileUploadData: function (file, data) {
      console.log(data.length + ' of ' + file.fieldname + ' arrived');
  },
  onFileUploadComplete: function (file) {
      console.log(file.fieldname + ' uploaded to  ' + file.path);
  }
});


//Route

    router.route('/user/signmeup')
      .post(function(req, res){
        upload.array('profilePicture', 2)(req, res, (err) => {
          console.dir(req.headers['content-type']);
          if (err) {
            console.log('err', err);
          }else{
            console.log('coming here');  console.log(req.files); console.log(req.body);
            var reg = new Registration();
            let args = { body : req.body, session : req.session };
            reg.applyForMembership(args, function(err, result){
              res.json(result);
            });
          }
        });
      });

经过中间件处理后,req.body和req.files始终以以下方式打印

coming here
[]
{ username: 'Yash',
  email: 'gnanajothi@gmail.com',
  password: 'yash',
  confirmPassword: 'yash',
  profilePicture: '[object FileList]' }

这是否与前端表单处理和/或我的应用程序中 multer 的配置方式有关。

非常感谢您的帮助,在过去的几天里一直在苦苦挣扎,但似乎什么都没有起作用。

谢谢, Gj


你找到解决方案了吗?如果有,请添加答案。 - Illep
2个回答

7

好的,我曾经为此苦苦挣扎了数小时-最终我成功地解决了它。

问题在于我需要在<input type='file' />标签中添加一个"name"属性,像这样:<input type='file' name='myFileName'>

然后,我还得确保在我的multer设置中,我在array()函数调用中有完全相同的“myFileName”名称 - 就像这样:

router.post('/', multer({dest:'./uploads'}).array('myFileName', 1), function(req, res, next) {});

这个方法可以解决问题。

希望这有所帮助!


如果这不起作用,请确保您像这篇文章中所述定义了multer.storage https://stackoverflow.com/questions/26994439/node-js-expressjs-multer-req-files-outputs-empty - murage kibicho
我的问题是在<form>元素中缺少enctype="multipart/form-data" - Asaf

0
要正确获取req.file,首先必须以正确的方式设置.post()参数。使用以下方式:
router.route('/user/signmeup').post(upload.array('profilePicture', 2),
function(req, res){
        console.dir(req.headers['content-type']);
        if (err) {
            console.log('err', err);
        }else{
            console.log('coming here');
            console.log(req.files);
            console.log(req.body);
            var reg = new Registration();
            let args = { body : req.body, session : req.session };
            reg.applyForMembership(args, function(err, result){
            res.json(result);
            });
        }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接