【问题标题】:Node.Js multer req.file always undefinedNode.Js multer req.file 总是未定义
【发布时间】:2018-07-20 19:51:42
【问题描述】:

我正在尝试使用 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();
      });

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

【问题讨论】:

    标签: javascript node.js multer


    【解决方案1】:

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

    您的&lt;form&gt; 元素中有错字。该属性称为enctype,而不是“加密”。你可以简单地添加method="POST"属性并删除所有javascript并让浏览器上传。

    示例:

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

    【讨论】:

    • 您的样本有效,非常感谢。你能告诉我如何捕捉响应吗?
    • 你想在哪里捕捉它?您希望浏览器停留在带有上传表单的页面上吗?
    • 我建议发送重定向。使用快递,您可以在这里查看如何操作:expressjs.com/en/4x/api.html#res.redirect
    【解决方案2】:

    我在 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。

    【讨论】:

      猜你喜欢
      • 2021-10-02
      • 1970-01-01
      • 2017-01-26
      • 2018-08-06
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2020-12-17
      • 2016-06-21
      相关资源
      最近更新 更多