Node.Js multer req.file 始终未定义

Node.Js multer req.file always undefined

我正在尝试使用 multer 上传文件,但总是 req.file 未定义且目标文件夹为空:

服务器:

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

    var storage = multer.diskStorage({
            destination: function(req, file, cb) {
                cb(null, './public/uploads/'); // Make sure this folder exists
            },
            filename: function(req, file, cb) {
                            console.log(file)
                var ext = file.originalname.split('.').pop();
                cb(null, file.fieldname + '-' + Date.now() + '.' + ext);
            }
        }),
        upload = multer({
            storage: storage
        }).single('avatar');

    app.post('/uploads', upload, (req, res) => {
        console.log('body', req.body);
        console.log('file', req.file);
                res.json("ok")
    });

客户:

我看了很多答案,但没有任何效果。

      <form id="myform" encrypt="multipart/form-data">
        <label for="userName">Name</label>
        <input type="text" name="userName"/>
        <br>
        <label for="phoneNumber">PhoneNumber</label>
        <input type="text" name="phoneNumber"/>
        <br>
        <label for="file">UploadFile</label>
        <input type="file" name="avatar"/>
        <input type="submit"/>
    </form>

$('#myForm').submit(function(e){

        var formData = new FormData($(this)[0]);
        $.ajax({
            type:'POST',
            url:'uploads',
            data : formData,
            contentType: true,
            processData: false
        }).done(function(data){
            //print response on success
            console.log(data);

        }).fail(function(data) {
              console.log('Error');
          });
        e.preventDefault();
      });

你能告诉我我做错了什么吗?

为什么要实施 $('#myForm').submit(function(e){...})

您的 <form> 元素中有错字。该属性称为 enctype,而不是 "encrypt"。您可以简单地添加 method="POST" 属性并删除所有 javascript 并让浏览器上传。

样本:

<form method="POST" action="/uploads" enctype="multipart/form-data">
 .....
</form>

我发现 ajax 中的错误 我必须将内容类型设置为 false:

$('#myForm').submit(function(e){

        var formData = new FormData($(this)[0]);
        $.ajax({
            type:'POST',
            url:'uploads',
            data : formData,
            contentType: false, // <-----------------
            processData: false
        }).done(function(data){
            //print response on success
            console.log(data);

        }).fail(function(data) {
              console.log('Error');
          });
        e.preventDefault();
      });

感谢@Marc。