Node js通过jquery发送post请求表单数据错误

san*_*h_p 5 javascript jquery form-data ajaxform node.js

我想通过 jQuery 请求发送文件post。我的 node.js 将读取该文件并插入data到 Mongodb 中。

这是我的 node.js 函数:

upload: function(req, res){
    var FileName;
      req.file('myFile').upload(function(err,files){
      var i = 1;
        if(err) return res.serverError(err);
      FileName = files[0].filename; ......
Run Code Online (Sandbox Code Playgroud)

post如果直接从html以下位置发送请求,上述函数可以正常工作:

<form method="post" action="/indi id="indiform" enctype="multipart/form-data">
        <input type="file" name="myFile" id="myIndifile"/>
        <input type="submit" id="indisubmitbutton" value="Submit" name="upload" class="btn btn-primary" id = "uploadFile"/>   
</form>
Run Code Online (Sandbox Code Playgroud)

现在我想提交post来自 jQuery 的请求并将响应处理data为:

var file = $("#myIndifile")[0].files[0];
$.ajax({
    type: 'post',
    url: '/indi',
    async: false,
    data: JSON.stringify({ myFile:file }),
    contentType: "application/json",
    success: function (data) {
      alert(" Number of lines Read  :"+data[0].lines+"\n"+"Number of records saved:"+data[1].saved);        
    }
  });
Run Code Online (Sandbox Code Playgroud)

这是投掷 Cannot read property 'filename' of undefined at FileName = files[0].filename error

如果我发送这样的请求:

var file = $("#myIndifile")[0].files[0];
var formdata = new FormData();
formdata.append("myFile", file);
  $.ajax({
    type: 'post',
    url: '/indi',
    data: formdata,
    contentType: "multipart/form-data",
    success: function (data) {
      Pace.stop;
      alert(" Number of lines Read  :"+data[0].lines+"\n"+"Number of records saved:"+data[1].saved);        
    }
  });
Run Code Online (Sandbox Code Playgroud)

JavaScript抛出 Uncaught TypeError: Illegal invocation error.

post如果我从 html发送请求,一切正常。

如何post从具有文件内容的 jQuery 发送请求?

Mus*_*usa 3

第二个代码片段的问题是您设置的内容类型不正确,多部分表单数据需要边界。但是,当您将 FormData 对象传递给 $.ajax 时,如果您将 contentType 和 processData 设置为 false,它会为您设置正确的内容类型和边界。

var file = $("#myIndifile")[0].files[0];
var formdata = new FormData();
formdata.append("myFile", file);
  $.ajax({
    type: 'post',
    url: '/indi',
    data: formdata,
    contentType: false,
    processData: false,
    success: function (data) {
      Pace.stop;
      alert(" Number of lines Read  :"+data[0].lines+"\n"+"Number of records saved:"+data[1].saved);

    }
});
Run Code Online (Sandbox Code Playgroud)