【问题标题】:Upload file and JSON data in the same POST request using jquery ajax?使用 jquery ajax 在同一个 POST 请求中上传文件和 JSON 数据?
【发布时间】:2018-01-17 13:39:38
【问题描述】:

我正在尝试使用 jQuery Ajax 发送 POST 请求,我想在其中上传文件和一些 json 数据。请找代码,

var logoImg = $('input[name="logoImg"]').get(0).files[0];
var formData = new FormData();
formData.append('logo', logoImg);

var objArr = [];
objArr.push({
  "id": id,
  "name": userName
});

var obj = [{
  "objArr": objArr,
  "formData": formData
}];

$.ajax({
  type: "POST",
  url: url,
  dataType: "json",
  data: JSON.stringify(obj),
  contentType: "application/json",
  cache: false,
  async: false,
  complete: function(data) {
    alert("success");
  }
});

但是我收到了Internal server error: 500 并且没有调用后端 API。

请帮我在同一个 AJAX 请求中发送一个文件和一个数组 obj。提前致谢

【问题讨论】:

    标签: jquery ajax post upload


    【解决方案1】:

    您不能序列化您在请求中发送的任何二进制数据。

    要使用FormData 对象发送附加信息,只需使用append() 方法添加它,类似于您使用图像本身的方式:

    var logoImg = $('input[name="logoImg"]').get(0).files[0];
    var formData = new FormData();
    formData.append('logo', logoImg);
    formData.append('id', id);
    formData.append('name', userName);
    
    $.ajax({
      type: "POST",
      url: url,
      data: formData,
      contentType: false,
      processData: false,
      cache: false,
      complete: function(data) {
        alert("success");
      }
    });
    

    注意选项中的重要部分是将contentTypeprocessData 设置为false,并删除async: false 以便异步发生请求。

    最后,请注意,如果您要在请求中发送的输入都包含在同一个表单中,您可以使用 FormData 构造函数将代码简化为:

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

    【讨论】:

    • 没错。它是表单数据。如果您真的想要,您可以在其中一个属性中发送 JSON,例如。 formData.append('json', JSON.stringify({ foo: 'bar' }));
    • 好的,但是,我在 vardump 中收到了这个帖子变量中的数据,我得到了这个:array(1) { ["jsonData"]=> string(166) "[{"s-file[]":"Prueba 3"},{"text_file[]":"Sistema.jpg"},{"idform":"f-gen-desk"},{"idprocess":"p-save"}]" } 当我尝试解码时,我得到了 null
    • 我建议开始一个新问题,因为这个问题似乎与这个问题无关。
    • 那么现在如何在服务器端访问它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 2020-08-09
    • 2020-09-21
    相关资源
    最近更新 更多