你能告诉我这是错的吗?
var formdata = new FormData();
formdata.append("key", "value");
console.log(formdata);
我的输出看起来像这样,我找不到我的“钥匙” - “价值”对
FormData
*__proto__: FormData
**append: function append() { [native code] }
***arguments: null
***caller: null
***length: 0
***name: "append"
***prototype: append
***__proto__: function Empty() {}
*constructor: function FormData() { [native code] }
**arguments: null
**caller: null
**length: 0
**name: "FormData"
**prototype: FormData
**toString: function toString() { [native code] }
*__proto__: Object
**__proto__: Object
**__defineGetter__: function __defineGetter__() { [native code] }
**__defineSetter__: function __defineSetter__() { [native code] }
**__lookupGetter__: function __lookupGetter__() { [native code] }
**__lookupSetter__: function __lookupSetter__() { [native code] }
**constructor: function Object() { [native code] }
**hasOwnProperty: function hasOwnProperty() { [native code] }
**isPrototypeOf: function isPrototypeOf() { [native code] }
**propertyIsEnumerable: function propertyIsEnumerable() { [native code] }
**toLocaleString: function toLocaleString() { [native code] }
**toString: function toString() { [native code] }
**valueOf: function valueOf() { [native code] }
我无法理解!昨天它工作得很好,今天我的头撞了很多次键盘! Firefox,Chrome都是一样的:/
答案 0 :(得分:110)
Chrome 50+和Firefox 39+(分别为44 +)的新功能:
formdata.entries()
(与Array.from()
结合使用以实现可调试性)formdata.get(key)
原始回答:
我通常用来“调试”一个FormData
对象,只是发送它(在任何地方!)并检查浏览器日志(例如Chrome devtools的“网络”标签)。
您不需要/相同的Ajax框架。您不需要任何细节。只需发送:
var xhr = new XMLHttpRequest;
xhr.open('POST', '/', true);
xhr.send(data);
易。
答案 1 :(得分:51)
你说它不起作用。你期待发生什么?
无法从 FormData
对象中获取数据;它只是用于与XMLHttpRequest
对象一起发送数据(对于send
方法)。
近五年后的更新:在一些较新的浏览器中,这已不再适用,您现在可以看到提供给FormData
的数据,只需将数据填入其中。 See the accepted answer了解更多信息。
答案 2 :(得分:17)
你可能遇到了我最初遇到的同样问题。我试图使用FormData来获取所有输入文件以上传图像,但同时我想将会话ID附加到传递给服务器的信息中。这一次,我想通过附加信息,你可以通过访问对象在服务器中看到它。我错了。附加到FormData时,检查服务器上附加信息的方法是通过简单的$_POST['*your appended data*']
查询。像这样:
JS:
$('form').submit(function(){
var sessionID = 8;
var formData = new FormData(this);
formData.append('id', sessionID);
$.ajax({
url: "yoururl.php",
data: formData,
processData: false,
contentType: false,
type: 'POST',
success: function(data){
alert(data);
}
});
});
然后在php:
$sessionID = $_POST['id'];
$files = $_FILES['image'];
$foreach ($files as $key=>val){
//...
}
答案 3 :(得分:16)
如果您使用Chrome浏览器,则可以查看发布数据
以下是如何检查发布数据
答案 4 :(得分:8)
console.log(formData.getAll('your key'))
;
看着
https://developer.mozilla.org/en-US/docs/Web/API/FormData/getAll
答案 5 :(得分:2)
在我的Edge浏览器中:
const formData = new FormData(this.form);
for (const [key, value] of formData.entries()) {
formObject[key] = value;
}
给我同样的错误
所以我不使用FormData
,而是手动构建对象
import React from 'react';
import formDataToObject from 'form-data-to-object';
...
let formObject = {};
// EDGE compatibility - replace FormData by
for (let i = 0; i < this.form.length; i++) {
if (this.form[i].name) {
formObject[this.form[i].name] = this.form[i].value;
}
}
const data = formDataToObject.toObj(formObject): // convert "user[email]":"customer@mail.com" => "user":{"email":"customer@mail.com"}
const orderRes = await fetch(`/api/orders`, {
method: 'POST',
credentials: 'same-origin',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
});
const order = await orderRes.json();
答案 6 :(得分:0)
确保标题带有'content-type': 'multipart/form-data'
_handleSubmit(e) {
e.preventDefault();
const formData = new FormData();
formData.append('file', this.state.file);
const config = {
headers: {
'content-type': 'multipart/form-data'
}
}
axios.post("/upload", formData, config)
.then((resp) => {
console.log(resp)
}).catch((error) => {
})
}
_handleImageChange(e) {
e.preventDefault();
let file = e.target.files[0];
this.setState({
file: file
});
}
#html
<input className="form-control"
type="file"
onChange={(e)=>this._handleImageChange(e)}
/>
答案 7 :(得分:0)
表单数据未出现在网络浏览器控制台中
for (var data of formData) {
console.log(data);
}
尝试以这种方式显示
答案 8 :(得分:0)
我遇到了同样的问题,所以我做了以下事情:
const formData = {
name: 'value',
surname: 'value',
anotherData: 'value'
}
await MyApi.post('/', formData);