【问题标题】:node js sending post request through jquery form data error节点js通过jquery表单数据错误发送post请求
【发布时间】:2014-09-08 19:43:09
【问题描述】:

我想通过 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; ......

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

<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>

现在我想从 jQuery 提交 post 请求并将响应 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);        
    }
  });

这是抛出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);        
    }
  });

javascript 抛出 Uncaught TypeError: Illegal invocation error.

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

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

【问题讨论】:

标签: javascript jquery node.js form-data ajaxform


【解决方案1】:

上面的答案对我有用。如果它不起作用,你可以试试这个在 javascript 中的。两个都可以正常工作。

var fd = new FormData;

    var file = document.getElementById('myIndifile').files[0];
    fd.append('myFile', file);
    var xhr = new XMLHttpRequest();
    xhr.file = file; 
    xhr.addEventListener('progress', function(e) {
        var done = e.position || e.loaded, total = e.totalSize || e.total;
        console.log('xhr progress: ' + (Math.floor(done/total*1000)/10) + '%');
    }, false);
    if ( xhr.upload ) {
        xhr.upload.onprogress = function(e) {
            var done = e.position || e.loaded, total = e.totalSize || e.total;
            console.log('xhr.upload progress: ' + done + ' / ' + total + ' = ' + (Math.floor(done/total*1000)/10) + '%');
        };
    }
    xhr.onreadystatechange = function(e) {
        if ( 4 == this.readyState ) {
            console.log(['xhr upload complete', e]);
            var resdata = JSON.parse(xhr.responseText);
            alert(" Number of lines Read  :"+resdata[0].lines+"\n"+"Number of records saved:"+resdata[1].saved);

        }
    };
    xhr.open('post', '/indi', true);
    xhr.send(fd);
});

【讨论】:

    【解决方案2】:

    您的第二个代码 sn-p 的问题是您设置的内容类型不正确,mutipart-formdata 需要一个边界。但是,当您将 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);
    
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-20
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      相关资源
      最近更新 更多