【问题标题】:Multer access req.body without uploading filesMulter 访问 req.body 而不上传文件
【发布时间】:2017-05-01 10:54:50
【问题描述】:

我有一个表单,其中包含一些不能为空的文本字段和文件输入,我想先对文本字段进行一些操作(添加到数据库),如果这些操作成功,然后上传文件。这是我现在的代码:

var multer = require('multer');
var getFields = multer();
router.post('/add',getFields.array(),function(req,res){
var artist = new ArtistModel({
            name : req.body.name.toLowerCase(),
            description:req.body.description,
          });

然后我将艺术家添加到我的数据库中,并在成功的回调中我希望上传文件。但是问题是我不能简单地使用 getFields.array() 因为我有文件输入并且我收到“意外字段”错误,如果我不使用 .array() 我将无法获得发布请求正文。有没有先获取 enctype="multipart/form-data" 的表单文本字段然后上传文件?

更新 #2 感谢Dave 我能够在不上传文件的情况下获取文本字段,我成功地将我的艺术家添加到我的数据库中,但是我不知道如何在之后上传文件, 我在 addToDb 的回调函数中创建了一个新变量:

var storage = multer.diskStorage({
            destination: function (req, file, cb) {
              //cb(null, 'artistsMedia/drake/songs')
              var dir = 'artistsMedia/' + req.body.name.toLowerCase()+ '/images';
              mkdirp(dir,err => cb(err,dir))
            },
            filename: function (req, file, cb) {
              cb(null, req.body.name.toLowerCase() +'-'+ file.fieldname +'-'+ Date.now() + path.extname(file.originalname)) //Appending extension
            },

          });
          var upload = multer({
            storage: storage,
            limits :{fileSize :52428800}
          }).fields([{name:'Logo',maxCount:1},{name:'artistHome',maxCount:1},{name:'otherImgs',maxCount:10}]);

但是调用upload(req,res,err) 似乎不起作用。

【问题讨论】:

  • 如果您想在创建艺术家后上传文件,REST 方法是创建艺术家,返回 201 CREATED 响应和 Location 响应标头(可能是带有新创建的对象)。然后,您的客户端将解析响应正文或响应标头以确定新对象的 ID,然后发出 second 请求以 POST 文件。 (或者您可以将文件与第一个请求一起发送并一次性完成)。

标签: node.js multer


【解决方案1】:

试试multer的any()函数:

var multer = require('multer');
var getFields = multer();
router.post('/add',getFields.any(),function(req,res){
  // any files, if sent, will be in req.files 
  var artist = new ArtistModel({
    name : req.body.name.toLowerCase(),
    description:req.body.description,
  });
});

如果你确定没有文件提交,使用multer的none()函数:

var multer = require('multer');
var getFields = multer();
router.post('/add',getFields.none(),function(req,res){
  // uploading files will cause an error
  var artist = new ArtistModel({
    name : req.body.name.toLowerCase(),
    description:req.body.description,
  });
});

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 2021-08-21
    • 2018-02-25
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    相关资源
    最近更新 更多