当前位置: 首页 > news >正文

JavaScript中的FormData类型示例

1. 创建 FormData 对象

可以通过构造函数直接创建空的 FormData 对象,或者从 HTML 表单元素初始化:

1
2
3
4
5
6
// 方法1:创建空的 FormData
const formData = new FormData();
 
// 方法2:从 HTML 表单初始化(自动包含表单的所有字段)
const formElement = document.querySelector('form');
const formDataFromForm = new FormData(formElement);

2. 添加数据到 FormData

使用 append() 方法添加字段(支持多次添加同名键):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const formData = new FormData();
 
// 添加文本字段
formData.append('username', 'JohnDoe');
formData.append('age', '25');
 
// 添加文件(通过文件输入框获取)
const fileInput = document.querySelector('input[type="file"]');
if (fileInput.files.length > 0) {
  formData.append('avatar', fileInput.files[0]); // 'avatar' 是字段名
}
 
// 可以添加多个同名键(如多选框)
formData.append('hobbies', 'reading');
formData.append('hobbies', 'gaming');

3. 发送 FormData 到服务器

通过 fetch 或 XMLHttpRequest 发送数据:

使用 fetch API

1
2
3
4
5
6
7
8
fetch('/api/upload', {
  method: 'POST',
  body: formData, // 直接传递 FormData 对象
  // 注意:不要手动设置 Content-Type,浏览器会自动添加 multipart/form-data
})
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Error:', error));

使用 XMLHttpRequest

1
2
3
4
5
6
7
8
const xhr = new XMLHttpRequest();
xhr.open('POST', '/api/upload');
xhr.onload = function() {
  if (xhr.status === 200) {
    console.log('Upload success:', xhr.responseText);
  }
};
xhr.send(formData);

4. 读取 FormData 内容

虽然 FormData 主要用于发送数据,但也可以通过以下方式读取内容:

1
2
3
4
5
6
7
8
9
10
// 遍历所有字段
for (const [key, value] of formData.entries()) {
  console.log(key, value);
}
 
// 获取单个字段的值(仅第一个)
const username = formData.get('username');
 
// 检查字段是否存在@www.xuepai.net
const hasAge = formData.has('age');

5. 注意事项

  1. 文件上传FormData 是上传文件的推荐方式,支持多文件(files[0]files[1]...)。
  2. Content-Type:浏览器会自动设置 Content-Type: multipart/form-data 并附加边界参数,无需手动指定。
  3. 兼容性:现代浏览器均支持 FormData,但在旧版 IE 中可能需要 polyfill(如 formdata-polyfill)。

完整示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<form id="myForm">
    <input type="text" name="username" placeholder="Username">
    <input type="file" name="avatar">
    <button type="submit">Submit</button>
  </form>
   
  <script>
    document.getElementById('myForm').addEventListener('submit', async (e) => {
      e.preventDefault();
      const formData = new FormData(e.target);
      formData.append('username', 'some data'); ///@www.haoshilao.net测试append方法添加同名键
 
      console.log('FormData:', formData);
      for (const [key, value] of formData) {
        console.log(key, value)
      }
   
      try {
        const response = await fetch('/api/upload', {
          method: 'POST',
          body: formData,
        });
        const result = await response.json();
        console.log('Success:', result);
      } catch (error) {
        console.error('Error:', error);
      }
    });
  </script>

 

http://www.jsqmd.com/news/194725/

相关文章:

  • 大国战争家 方达炬:“经济发明事业是我一生中最重要的活动之一,它(经济发明事业)引使我先有于造物主前、也经使我先占于造物主前。”
  • 2026最新延吉烤肉/韩式烤肉餐厅首选特捞基韩式烤肉店——延边大学网红墙附近延吉本地特色加盟品牌,延吉品质之王,10年匠心坚守的味蕾盛宴 - 全局中转站
  • 详细介绍:关于图的算法——kruskal算法,prime算法,和Dijkstra算法
  • 13.C++入门:vector|定义|迭代器的使用|空间增长|增删查改|迭代器失效问题|OJ题
  • TypeScript的export用法示例
  • 14.C++入门:vector|手撕vector
  • 技术文章大纲:Bug悬案侦破大会
  • 张吕敏长视频生成新技术:20秒视频历史压缩成5000个Token,消费级显卡也能跑
  • MBA必看!8个降AI率工具测评榜单
  • 高效清理临时文件,释放磁盘空间
  • 提示工程架构师必收藏:安全标准实施框架
  • 2026辣椒蘸料品牌top5推荐榜,优质工厂及供应商深度解析/选择指南 - 全局中转站
  • 系统限制对线程数的设定有哪些具体影响
  • 选择可信数据空间安全服务商:源堡科技以风险管控能力破局
  • RocketMQ 架构与术语详解
  • 多线程程序应该开多少线程
  • 华为OD机考双机位C卷 - 字符串计数匹配 (Java Python JS C/C++ GO )
  • 2026最新延吉韩式烤肉餐厅top5推荐!延吉本地延边大学等地加盟餐饮品牌深度解析及选择指南 - 全局中转站
  • 友链测试
  • 2026年1月火锅底料推荐与评价:从家庭厨房到餐饮后厨 - 速递信息
  • 从基础到进阶,助你成为AI大模型专家_2025最新AI大模型学习路线:(非常详细)
  • vp 2025冬季PAT甲级
  • HISTFILE 介绍
  • 狂想:2026-1-3我的原创思考:意识作为“生态聚落的目的性涌现”
  • 35岁程序员转行大模型:前景分析与实战路径,助你把握技术红利_35岁程序员转行大模型前景分析与转型指南
  • C和汇编混合编程
  • 安益日化:品牌推荐高品质洗护用品ODM代加工 - 速递信息
  • Availability(可用性)与高可用架构 内容的结构化知识点汇总
  • Agentic AI合规经验:提示工程架构师如何打造个人品牌?
  • CF830E Perpetual Motion Machine