节点js multer文件上传不起作用。 req.file和req.files总是未定义的

时间:2018-02-24 01:04:49

标签: javascript jquery node.js express multer

我正在尝试将文件上传到我的服务器,但在我的POST REST端点上始终未定义req.filereq.files

我试图上传的内容是一个“.dat”文件,我期待一个json响应。

这是我的代码:

服务器端:

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

var app = express()

app.post('/creoUpload', upload.single('uploadFileField'), function(req, res, next) {
  console.log("req.file = ",JSON.stringify(req.file)); //is undefined
  console.log("req.files = ",JSON.stringify(req.files)); //also undefined
});

客户端:

<form id="creoUploadForm" action="/creoUpload" enctype="multipart/form-data" method="post">
    <input type='file' name='uploadFileField'><br><br>
    <input type='submit' value='Upload'/>
</form>

JS:

$( "#creoUploadForm" ).submit(function( event ) {
    event.preventDefault();
    var formData = new FormData($(this)[0]);
    $.ajax({
          url: '/creoUpload',
          type: 'POST',
          data: formData,
          async: true,
          cache: false,
          contentType: false,
          processData: false,
          success: function (returndata) {
              console.log("RETURN DATA IS: ",returndata);
          },
          error: function (err) {
              console.log("ERROR: ",err);
          }
    });
});

我一直在玩这些田地,但它不起作用..有人看到我在这里做错了吗?

我正在关注https://www.npmjs.com/package/multer

中的示例

版本:

  • Express Version:4.12.0
  • 节点版本:6.5.0
  • JQuery:1.12.1

谢谢!

4 个答案:

答案 0 :(得分:2)

我有同样的问题,如果你查看Error Handling部分的文档,还有另一种实现方式,那就是适用于我的方法。代码将是这样的:

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

app.post('/creoUpload', function(req, res, next) {
  upload(req, res, function (err) {
    if (err) {
      // An error occurred when uploading
      console.log('Err: ', err);
      return;
    } else {
       console.log('req.file: ', JSON.stringify(req.file));  
       console.log('req.files: ', JSON.stringify(req.files));
       return;
    }
  })
});

答案 1 :(得分:1)

如果req.filereq.filesundefined,则问题是 multer 未收到上传的文件,此问题似乎与{{{ 1}}。

使用 jQuery&#39; v1.12.1&#39;上传FormData不受支持,它根本不会发送任何内容。 我建议您尝试使用 fetch Api或将jQuery的版本更改为 3.3.1

我已经测试了代码,当我将jQuery版本从 v1.12.1 更改为 v3.3.1 时,我已成功将文件上传到我的服务器。

答案 2 :(得分:1)

您正在使用multer作为中间件,因此在进入您的功能并打印之前,它已将图像上传到存储并从 req.files 中删除记录。

您可以通过两种方式访问​​req.files。

  1. 使用multer作为 finw3 所声明的功能。

  2. 另一个解决方案是:

  3. //代码开始

    var storage = multer.diskStorage({
    
      destination: function (req, file, cb) {
    
        cb(null, '/filepath')
      },
    
    
      filename: function (req, file, cb) {
    
        let filename = 'filenametogive';
         req.body.file = filename
    
        cb(null, filename)
      }
    })
    
    var upload = multer({ storage: storage })
    

    //代码结束

    现在您可以访问req.body.file

    中的文件

答案 3 :(得分:1)

不要将contentType设置为false,因为POST方法需要contentType = 'w-xxx-form-urlencoded',这是JQ默认值。