0

我正在尝试将文本文件上传到 python 脚本。如果我只是上传表单数据并使用

form_contents = $(this).serialize() + "&async=true"; 

然后表单将保留在网页上并显示结果。如果我使用

var formData = new FormData($('form')[0]);

它提交表单和数据文件,但不会停留在网页上。如何添加 +&async=true以使其保留在网页上。还是有其他方法可以做到这一点?

停留在网页上但不上传文件:

          $('#upload').submit(function () {
      form_contents = $(this).serialize() + "&async=true";
      form_action = $(this).attr('action');

      $.ajax({
      type: 'post',
          data: formData,
      url: form_action,
      success: function (result) {
      $('#upload').html(result);
      } 
      });
      return false;
  });

不停留在网页上,但上传文件:

$('#upload').submit(function () {
    var formData = new FormData($('form')[0]);
    form_action = $(this).attr('action');

    $.ajax({
    type: 'post',
    xhr: function() {
        myXhr = $.ajaxSettings.xhr();
        if(myXhr.upload){ 
        myXhr.upload.addEventListener('progress',progressHandlingFunction, false);
    }
    return myXhr;
    },
    data: formData,
    url: form_action,
    success: function (result) {
        $('#upload').html(result);
    }
    });
    return false;
    });

谢谢你的帮助,

马特

4

2 回答 2

0

你不会只是简单地在表单中添加一个隐藏的输入元素吗?
<input type=hidden name="async" value="true">
...那么这个值将自动成为您序列化数据的一部分formData

于 2015-01-08T05:59:44.330 回答
0

您还需要将 contentType 和 processData 参数设置为 false。

$('#upload').submit(function () {
  var formData = new FormData($('form')[0]);
  form_action = $(this).attr('action');

  $.ajax({
    type: 'post',
    xhr: function () {
      myXhr = $.ajaxSettings.xhr();
      if (myXhr.upload) {
        myXhr.upload.addEventListener('progress', progressHandlingFunction, false);
      }
      return myXhr;
    },
    data: formData,
    url: form_action,
    processData: false,
    contentType: false,
    success: function (result) {
      $('#upload').html(result);
    }
  });
  return false;
});

但是,如果发生错误,表单将继续提交,因为它永远不会到达return false;. 要停止它以便您可以看到错误,请使用 event.preventDefault。

$('#upload').submit(function (e) {
  e.preventDefault();
  var formData = new FormData($('form')[0]);
  form_action = $(this).attr('action');

  $.ajax({
    type: 'post',
    xhr: function () {
      myXhr = $.ajaxSettings.xhr();
      if (myXhr.upload) {
        myXhr.upload.addEventListener('progress', progressHandlingFunction, false);
      }
      return myXhr;
    },
    data: formData,
    url: form_action,
    processData: false,
    contentType: false,
    success: function (result) {
      $('#upload').html(result);
    }
  });
});
于 2013-01-16T18:23:40.040 回答