我需要使用ajax和FormData发送一些数据,因为我想发送文件和其他一些参数。我通常发送数据的方式是这样的:
$.ajax({ type: 'POST', url: 'some_url', dataType: 'json', processData:false, contentType:false, data:{ Lvl_1-1: 'something', Lvl_1-2: 'something', Lvl_1-3: { Lvl_1-3-1: "something", Lvl_1-3-2: "something", Lvl_1-3-3: "something", }, }, ... });
如果我不使用FormData(),就没有问题,但是当使用FormData()时,只有Lvl1上的数据可以,但是嵌套的任何内容都显示为这样的字符串
<b>array</b> <i>(size=3)</i> 'Lvl1-1' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'Something'</font> <i>(length=23)</i> 'Lvl1-2' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>''Something''</font> <i>(length=3)</i> 'Lvl1-3' <font color='#888a85'>=></font> <small>string</small> <font color='#cc0000'>'[object Object]'</font> <i>(length=17)</i>
如果我使用FormData()对Lvl1-3中的数据进行编码,而不是[object Object]得到[object FormData]
[object Object]
[object FormData]
如何在Lvl1-3上获取数组而不是字符串?
注意:如果文件位于顶层(Lvl_1),则可以使用FormData()毫无问题地发送文件。我没有写附件的代码,因为这不是问题,嵌套数据是问题。我刚刚提到了该文件,因为这就是为什么我使用FormData()的原因。
URL编码表单数据没有任何本机方式来表示复杂的数据结构。它仅支持简单的键=值对。
?foo=1&bar=2
大多数表单数据解析库允许使用具有相同名称的键来数组数据
?foo=1&foo=2
PHP在该格式之上附加了自己的语法:
?foo[]=1&foo[]=2
它允许在关联数组中使用命名键:
?foo[bar]=1&foo[baz]=2
和嵌套数组:
?foo[bar][level2a]=1&foo[bar][level2b]=2
由于PHP的盛行,当您将JavaScript对象传递给时,jQuery会采用该语法生成表单数据data。
data
如果您想使用,FormData那么jQuery不会为您重新处理它。
FormData
您看到的效果是因为您试图将一个对象(我想是一个FormData实例,但是您没有显示代码的那一部分)作为第二个参数append-需要字符串。
append
您需要自己使用PHP的语法生成键名。
form_data_instance.append("Lvl_1-3[Lvl_1-3-1]", "something"); form_data_instance.append("Lvl_1-3[Lvl_1-3-2]", "something"); form_data_instance.append("Lvl_1-3[Lvl_1-3-3]", "something");