FormData是JavaScript中的一个接口,用于构造一组键值对,表示表单数据。它可以与XMLHttpRequest或Fetch API一起使用,方便地发送表单数据或二进制文件。
// 创建一个新的FormData对象
const formData = new FormData();
// 添加文本数据
formData.append('username', 'JohnDoe');
formData.append('email', 'john@example.com');
// 添加文件数据
const fileInput = document.querySelector('input[type="file"]');
if (fileInput.files.length > 0) {
formData.append('avatar', fileInput.files[0]);
}
// 添加JSON数据
const settings = { theme: 'dark', notifications: true };
formData.append('settings', JSON.stringify(settings));
// 使用XMLHttpRequest
const xhr = new XMLHttpRequest();
xhr.open('POST', '/api/upload');
xhr.onload = function() {
if (xhr.status === 200) {
console.log('上传成功', xhr.responseText);
} else {
console.error('上传失败');
}
};
xhr.send(formData);
// 使用Fetch API
fetch('/api/upload', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => console.log('成功:', data))
.catch(error => console.error('错误:', error));
原因:
解决方案: 确保服务器端能够处理multipart/form-data格式。例如在Node.js中使用multer中间件:
const express = require('express');
const multer = require('multer');
const upload = multer();
app.post('/api/upload', upload.none(), (req, res) => {
console.log(req.body); // 包含表单数据
res.send('数据接收成功');
});
原因: FormData只能接受字符串或Blob对象
解决方案: 将复杂对象转换为JSON字符串:
const complexData = { user: { name: 'John', age: 30 } };
formData.append('userData', JSON.stringify(complexData));
解决方案: 使用XMLHttpRequest的progress事件:
xhr.upload.onprogress = function(event) {
if (event.lengthComputable) {
const percentComplete = (event.loaded / event.total) * 100;
console.log(percentComplete + '% 已上传');
}
};
const form = document.getElementById('myForm');
const formData = new FormData(form);
// 检查是否有特定键
formData.has('username'); // 返回true或false
// 获取特定键的值
formData.get('username'); // 返回第一个值
// 获取所有值
for (let [key, value] of formData.entries()) {
console.log(key, value);
}
// 修改值(实际上是添加一个新值)
formData.set('username', 'NewUsername');
// 删除值
formData.delete('email');
FormData是现代Web应用中处理表单数据的高效工具,特别适合需要上传文件或发送复杂数据的场景。