Multer和Express/Node文件上传

7

req.files返回null,现在req.body也是空的。我已经在这里搜索过所有的答案,但没有找到什么有用的信息。不幸的是,multer文档相当缺乏,希望有人能够了解我现在的问题,并知道发生了什么。

我的router.js文件如下:

var express = require('express');
var request = require('request');
var mid = require('../middleware');
var busboy = require('connect-busboy');
var fs = require('fs');
var multer = require('multer');
var upload = multer({dest: '../public/images/blog'});
var User = require('../data/models/user');
var router = express.Router();
...
...
...
...
/* POST saveblog router. */
router.post('/saveBlog', upload.any(),function(req, res, next) {
  console.log(req.body, 'Body'); 
  console.log(req.files, 'files');
  var title = req.body.titleInput;
  var body = req.body.bodyInput;
  request.post('http://' +req.headers.host + '/api/blog', {json: {body: body, title: title, userId: req.session.userId}},
  function(err, httpResponse, body) {
    if (err) {
      console.error('error posting blog');
    }
    console.log('Blog Post successfully uploaded');
  });
  return res.redirect('/blog');
}); 

module.exports = router;

我不确定出了什么问题,最初我将其设为 upload.single('image'),但那也没用,所以谁知道呢。

这是我要提交的jade表单,如果有人能帮忙但不喜欢jade,我相信我可以找到一个快速转换器。

form(action='saveBlog', enctype='multipart/form-data', method='post')
  h1 New Blog Post 
  fieldset(data-role='')
    label(for='title') Title 
    input(id='titleInput', name='titleInput', type='text', value='', placeholder='Your Title', require='true').form-control
    label(for='image') Your Title Image
    input(id='image',name='image', type='file', accept='image/*')
    br
    label(for='body') Your Article (Box is resizable)
    textarea(id='mytextarea', name='bodyInput').form-control
    input(type='submit', value='Post your Article').btn.btn-primary
2个回答

13

今天我一直在处理这个问题。我注意到,如果你正在使用upload.single(),那么你要查找的数据将在req.file中而不是req.files中。

但我不确定这是否是你遇到的问题。

顺便说一下,这个简化的例子对我来说可行:

server.js

var express = require('express');
var app = express();

app.use(require('./routes'));

app.listen(8080);

路由文件routes.js

var express = require('express');
var multer = require('multer');
var upload = multer({ dest: '/tmp/' });
var router = express.Router();

/* POST saveblog router. */
router.post('/saveBlog', upload.any(), function(req, res, next) {
  console.log(req.body, 'Body');
  console.log(req.files, 'files');
  res.end();
});

module.exports = router;

我用Postman发布了内容,并得到了以下输出:

{ test: '1' } 'Body'
[ { fieldname: 'asdas',
    originalname: 'vcenter.png',
    encoding: '7bit',
    mimetype: 'image/png',
    destination: '/tmp/',
    filename: '92f425268efaa45cad31f67ec8f14c2d',
    path: '/tmp/92f425268efaa45cad31f67ec8f14c2d',
    size: 54834 } ] 'files'

谢谢,这至少让我朝着正确的方向前进了(即先测试一个简化的情况,我在应用程序后期添加它有些过于雄心勃勃了)。 - matt.condit
@matt.condit,你解决上传文件的问题了吗?你能否帮我更新一下你是如何解决文件上传问题的呢? - Luzan Baral
@Dave,就我而言,我也没有得到fieldname。 - Luzan Baral
您的请求是否为 enctype="multipart/form-data" 的 POST 请求? - Dave

0

只需将req.file重命名为req.files。这对我起作用了。


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