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

我试图parsing从$.ajax()发送的multipart / form-data,并且在服务器端数据进入req.body不在req.files如express的文档中所述。

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

客户端Ajax请求发送function: –

  $('.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'); } }); } 

所以这两个问题是如何parsing通过ajax请求来的多部分数据。 第二如何通过nodemailer作为附件发送多部分数据。

请记住,我已经尝试使用app.use(express.multipart()); ,但是当我插入到我的app.js中时,它给了我400 bad request ,甚至没有执行contactUs函数。

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

使用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);