FormData 追加嵌套对象

Shi*_*agh 26 javascript jquery json form-data node.js

是否可以将嵌套对象附加到FormData?

let formData = new FormData();
let data = {
    title: 'title',
    text: 'text',
    preview: {p_title:'p title', p_text: 'p text'}
};

$.each(data, function(key, value) {
    formData.append(key, value);
});
Run Code Online (Sandbox Code Playgroud)

服务器控制台- console.log(req.body)

{
    title: 'title',
    text: 'text',
    preview: '[object Object]'
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到 的确切值preview: {p_title:'p title', p_text: 'p text'}

Emr*_*cel 11

首先,我为我糟糕的英语道歉。

我做了一些事情来在服务器端正确获取数据,而不是在写入控制台时。我希望你愿意这样做。

我必须编写一个 JavaScript 函数来获取服务器端的客户端嵌套数据。

为此,我编写了obj2FormData()函数。方括号似乎有效。

function obj2FormData(obj, formData = new FormData()){

    this.formData = formData;

    this.createFormData = function(obj, subKeyStr = ''){
        for(let i in obj){
            let value          = obj[i];
            let subKeyStrTrans = subKeyStr ? subKeyStr + '[' + i + ']' : i;

            if(typeof(value) === 'string' || typeof(value) === 'number'){

                this.formData.append(subKeyStrTrans, value);

            } else if(typeof(value) === 'object'){

                this.createFormData(value, subKeyStrTrans);

            }
        }
    }

    this.createFormData(obj);

    return this.formData;
}
Run Code Online (Sandbox Code Playgroud)

当使用Ajax发送数据时,我们将嵌套对象转换为FormData对象。

let formData = obj2FormData({
    name : 'Emrah',
    surname : 'Tuncel',
    birth: 1983,
    child : {
        name: 'Eylul',
        surname: 'Tuncel',
        toys: ['ball', 'baby']
    },
    color: ['red', 'yellow']
});
Run Code Online (Sandbox Code Playgroud)

现在让我们发送用ajax转换的FormData。

const xhr = new XMLHttpRequest();
xhr.addEventListener('load', response => {
    //AJAX RESPONSE >>

    console.log(response);

    //AJAX RESPONSE //
});
xhr.open('POST','response.php');
xhr.send(formData);
Run Code Online (Sandbox Code Playgroud)

当我用 PHP 将数据压到屏幕上时,我得到了我想要的确切结果。方法是 POST 还是 GET 并不重要。

响应.php

<pre><? print_r($_GET) ?></pre>
<pre><? print_r($_POST) ?></pre>
Run Code Online (Sandbox Code Playgroud)

输出如下。

Array
(
    [name] => Emrah
    [surname] => Tuncel
    [birth] => 1983
    [child] => Array
        (
            [name] => Eylul
            [surname] => Tuncel
            [toys] => Array
                (
                    [0] => ball
                    [1] => baby
                )

        )

    [color] => Array
        (
            [0] => red
            [1] => yellow
        )

)
Run Code Online (Sandbox Code Playgroud)

希望它对您的业务有利。


sul*_*lam 8

let formData = new FormData();
let data = {
  title: 'title',
  text: 'text',
  preview: {p_title:'p title', p_text: 'p text'}
};

for(let dataKey in data) {
  if(dataKey === 'preview') {
    // append nested object
    for (let previewKey in data[dataKey]) {
      formData.append(`preview[${previewKey}]`, data[dataKey][previewKey]);
    }
  }
  else {
    formData.append(dataKey, data[dataKey]);
  }
}
Run Code Online (Sandbox Code Playgroud)

控制台表单数据

for (let val of formData.entries()) {
  console.log(val[0]+ ', ' + val[1]); 
}
Run Code Online (Sandbox Code Playgroud)


Har*_*wal 7

要将对象附加到 formData,您需要先对其进行字符串化,如下所示:

let objToAppend= {
  key1: value1,
  key2: value2,
}
let formData = new FormData();
formData.append('obj', JSON.stringify(objToAppend));
Run Code Online (Sandbox Code Playgroud)

然后在服务器端访问它,您需要首先使用JSON.parse(). 希望能帮助到你!

  • 当值是文件时不起作用。 (2认同)
  • 仅当服务器需要 json 时才有效 (2认同)

Ore*_*hak 6

FormData值会自动转换为string. 您可以尝试使用Blob来做到这一点。

或者只是使用JSON.stringify(obj).

$.each(data, function(key, value){
    if (typeof(value) === 'object') {
        value = new Blob([JSON.stringify(value)], {type : 'application/json'});// or just JSON.stringify(value)
    }
    formData.append(key, value);
});
Run Code Online (Sandbox Code Playgroud)

  • 为什么要将其转换为 Blob?只需将 JSON 作为字符串发送,通过将其作为多部分二进制发送,您不会赢得任何东西,因为它不是二进制数据。 (2认同)

小智 6

这里有一个“A方便的JavaScript函数,将对象转换为FormData实例” github,也可以作为npm包提供,使用非常简单

let data = {
    title: 'title',
    text: 'text',
    preview: {p_title:'p title', p_text: 'p text'}
};

var formData = objectToFormData(data);
Run Code Online (Sandbox Code Playgroud)


小智 5

这对我来说是要做的工作:

用于.分隔键和子键

let formData = new FormData();
let data = {
  title: 'title',
  text: 'text',
  preview: {p_title:'p title', p_text: 'p text'}
};

for(let key in data) {
  if(typeof(data[key]) === 'object') {
    for (let subKey in data[key]) {
      formData.append(`${key}.${subKey}`, data[key][subKey]);
    }
  }
  else {
    formData.append(key, data[key]);
  }
}
Run Code Online (Sandbox Code Playgroud)