【问题标题】:req.file is undefined multerreq.file 是未定义的 multer
【发布时间】:2017-01-26 01:24:48
【问题描述】:

这让我发疯了。我试图搜索,但提供的所有解决方案都不起作用。 我正在尝试使用 multer 创建一个简单的文件上传,但似乎无法让它工作,因为 req.file 似乎总是未定义。

有什么想法吗?完全被难住了.. 没有任何效果,它只是以未定义的形式返回!

app.js

var path = require('path'),
routes = require('./routes'),
exphbs = require('express-handlebars'),
express = require('express'),
bodyParser = require('body-parser'),
cookieParser = require('cookie-parser'),
morgan = require('morgan'),
methodOverride = require('method-override'),
errorHandler = require('errorhandler');
moment = require('moment');


module.exports = function(app) {

  app.use(morgan('dev'));
  app.use(bodyParser.urlencoded({'extended':true}));
  app.use(bodyParser.json());
  //app.use(multer({ dest: path.join(__dirname, 'public/upload/temp')}));
  app.use(methodOverride());
  app.use(cookieParser('some-secret-value-here'));
  routes(app);//moving the routes to routes folder.

  app.use('/public/', express.static(path.join(__dirname,'../public')));
  if ('development' === app.get('env')) {
    app.use(errorHandler());
  }

  app.engine('handlebars', exphbs.create({
      defaultLayout: 'main',
      layoutsDir: app.get('views') + '/layouts',
      partialsDir: [app.get('views') + '/partials'],
      helpers: {
                timeago: function(timestamp) {
                          return     moment(timestamp).startOf('minute').fromNow();
                }
              }
  }).engine);
  app.set('view engine', 'handlebars');
      return app;
};

这是我的 HTML:

  <form method="post" action="/images" enctype="multipart/form-data">
<div class="panel-body form-horizontal">
  <div class="form-group col-md-12">
    <label class="col-sm-2 control-label" for="file">Browse:</label>
    <div class="col-md-10">
      <input class="form-control" type="file" name="file" id="file">
    </div>
  </div>

  <div class="form-group col-md-12">
    <label class="col-md-2 control-label" for="title">Title:</label>
    <div class="col-md-10">
      <input class="form-control" type="text" name="title">
    </div>
  </div>

  <div class="form-group col-md-12">
      <label class="col-md-2 control-label" for="description">Description:</label>
      <div class="col-md-10">
        <textarea class="form-control" name="description" rows="2"></textarea>
      </div>
    </div>

    <div class="form-group col-md-12">
        <div class="col-md-12 text-right">
          <button type="submit" id="login-btn" class="btn btn-success" type="button">
            <i class="fa fa-cloud-upload "></i> Upload Image</button>
        </div>
    </div>
  </div>
</form>

路线:

var express = require('express'),
path = require('path'),
router = express.Router(),
home = require('../controllers/home'),
image = require('../controllers/image'),
multer = require('multer');

var upload = multer({ dest: path.join(__dirname, 'public/upload/temp')});


module.exports = function(app) {
  router.get('/', home.index);
  router.get('/images/:image_id',  image.index);
  router.post('/images', upload.single('file'), image.create);
  router.post('/images/:image_id/like', image.like);
  router.post('/images/:image_id/comment', image.comment);
  app.use(router);
};

控制器:

    create: function(req, res) {        
console.log(req.file);
  }

只是另一个注释... Req.body 完全是空的......我认为它是: 身体{}

我想我已经取得了一些进展。我看到一些文件和正文的东西,但它仍然说它是未定义的? 正文:{标题:'fdsfdsa',描述:'fdsafdsa'}, originalMethod: 'POST', 秘密:'这里的一些秘密值', 饼干: {}, 签名饼干:{}, 路线: 路线 { 路径:'/图像', 堆栈:[[对象],[对象]], 方法:{帖子:真}}, 阅读:[功能], 文件: { 字段名:'文件', originalname: 'Chrysanthemum2.jpg', 编码:'7bit', mimetype: '图像/jpeg', 目的地:'C:\testapp\server\public\upload\temp', 文件名:'fd17765e4cd03268db6757b8cfb21649', 路径:'C:\testapp\server\public\upload\temp\fd17765e4cd03268db6757b8c b21649', 尺寸:15973 } } ypeError: 无法读取未定义的属性“文件”

【问题讨论】:

    标签: javascript node.js express multer


    【解决方案1】:

    如果您使用upload.single()(您的代码显示),那么结果将在req.file,而不是req.files。所以改变这个:

    create: function(req, res) {        
        console.log(req.files);
    }
    

    到这里:

    create: function(req, res) {        
        console.log(req.file);
    }
    

    另外,如果您希望使用这条路线:

    router.post('/images', image.create);
    

    那么,您没有为该路由安装 upload() 中间件。

    【讨论】:

    • @user1655940 - 查看我在回答中添加的关于没有为调用 image.create() 的路由安装中间件的内容。
    • 愚蠢的错误。刚刚做了更新和测试。仍然未定义。
    • @user1655940 我遇到了同样的问题。我想知道,你找到解决这个问题的方法了吗?没有多少人回答我遇到的同样问题。如果你这样做了,请更新。谢谢
    猜你喜欢
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2022-01-18
    • 1970-01-01
    • 2020-12-17
    • 2016-06-21
    相关资源
    最近更新 更多