如何解析通过ajax请求发送的multipart / form-data。

时间:2013-08-29 22:48:17

标签: javascript node.js express multipartform-data nodemailer

我正在尝试解析从$.ajax()发送的多部分/表单数据,而在服务器端,数据来自req.body而不是req.files,如明文文档中所述。

我要做的是通过$.ajax发送多个图像文件和表单数据,然后在服务器端接收它并通过 nodemailer 将这些图像作为附件发送,以便通过nodemailer发送它我需要能够读取它,我得到的只是req.body中的数据垃圾,我甚至无法阅读。代码如下。

客户端Ajax请求发送功能: -

   $('.contact-button').on('click', function(e) {
    e.preventDefault();
    var data = new FormData();

    var filesList = document.getElementById('files');
    for (var i = 0; i< filesList.files.length; i ++) {
        data.append('file', filesList.files[i]);
    }

    data.append('messageData', $('#contact-form').serialize());

    $.ajax({
        url: '/api/contactus/',
        data: data,
        processData: false,
        type: "POST",
        contentType: 'multipart/form-data',
        mimeType:    'multipart/form-data',
        success: function (data) {

            console.log("SUCCESS IN AJAX");
            console.dir(data);
        },
        error: function (err) {
            console.log('error  in AJAX');
            console.log(err);
        }
    });
});

处理请求的服务器端API:

function contactUs (req, res, next) {

    console.log("TESTING Body ");
    console.dir(req.body);

    console.log("TESTING Files");
    console.dir(req.files);

    var Transport   = email.createTransport("SMTP", {
        service: "Gmail",
        auth: {
            user: "dummy@dummy.com",
            pass: "dumy1234"
        }
    });

    Transport.sendMail({
        host    : "smtp.gmail.com",
        port    : "587",
        domain  : "domain.com",
        to      : "dummy@dummy.com",
        from    : "dummy@dummy.com",

        subject : "[Technical Support] "+EmailInfo.Name + " Submitted an Issue!",
        reply_to: req.body.Email,
        html    : "<h2 >Message Details</h2>",
        authentication : "login",
        username: 'dummy@dummy.com',
        password: 'dumy1234'
    }, function (err, result) {
        if (err) {
            next('email sending failed', err);
        } else {
            res.json('email sending Success');
        }
    });
}

所以这两个问题是如何通过ajax请求解析多部分数据。 second如何通过nodemailer将多部分数据作为附件发送。?

请记住,我已经尝试使用app.use(express.multipart());,但当我将其插入我的app.js时,它给了我400 bad request,甚至没有执行contactUs功能

2 个答案:

答案 0 :(得分:1)

$.ajax({     
     type: "POST",
     url: '/admin/systemgoalssystemgoalupdate?format=html',
     data: formdata,
     success: function (data) {
         console.log(data);
     },
     dataType: "json"
 });

答案 1 :(得分:0)

使用contentType: false为我解决了许多问题,仅针对那些正在寻找同一问题答案的人,这里有工作和更新的代码。

客户端Js: -

    submitHandler: function (form) {
        if(isClicked) {
            $('#result').removeClass('alert-success').addClass('alert-error').html("Ticket Already submitted").show();
            return false;
        }
        isClicked = true;
        var data = new FormData();
        data.append('messageData', $('#contact-form').serialize());
        var filesList = document.getElementById('files');
        for (var i = 0; i < filesList.files.length; i ++) {
            data.append('file', filesList.files[i]);
        }
        $.ajax({
            url:         '/api/contactus/',
            data:        data,
            processData: false,
            type:        'POST',
            contentType: false,
            success:     function (data) {
                $('#contact-form').html('<p><span>Thank You for contacting us!</span><br> We will get back to you very soon.<br> Your Ticket No. is <strong>'+data.TokenId+'</strong> </p><br><button class="btn btn-primary close-button" type="submit">Submit Another Ticket</button>');
            },
            error:       function (err) {
                var errorMsg = 'Issue Submission Failed ! ' + err.statusText;
                $('#result').removeClass('alert-success').addClass('alert-error').html(errorMsg).show();
            }
        });
    }

服务器端: -

在电子邮件发送的服务器端没有做任何特别的事情,只有附件以更通用的方式处理。

        attachments:    Attachments.map(function (f) {
    return   {
        fileName: f.name,
        filePath: f.path,
        cid:      f.path
    };
    })

此代码对于在邮寄附件后从临时文件夹中删除这些临时文件非常有用

  /* Clean up the temporary files. */
    Attachments.forEach(function (f) {
    fs.unlinkSync(f.path);
    });

这就是如何调用电子邮件发送代码,以便可以使用BodyParser()和multipart()。

app.post('/api/contactus/', express.multipart(), api_calls.contactUs);