如何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);