1. FormData的作用

1.1 将Form表单元素,转换成表单对象

在使用Ajax进行表单提交的时候,采用原生的js获取dom,然后添加属性.当表单项很多的时候,代码会很多.不利于后期阅读、维护.
这时,可以使用FormData对象,将HTML中的表单元素转换成表单对象,如下:

<!-- 表单对象 -->
<form id="form"><input type="text" name="username" /><input type="text" name="password" /><input type="button" />
</form>
  • 将HTML中的DOM元素转换成表单对象,
var form = document.getElementById('form');
var formData = new FormData(form);// 使用ajax传递表单对象
var xhr = new XMLHttpRequest();
xhr.open('post', 'http://localhost:3000/formData')
xhr.send(formData);
  • 此时,服务器端需要使用 formidable 进行接收
  • npm i formidable
const express = require('express')
const fomidable = require('formidable');
const app = express();
app.post('/formData',(req, res)=>{// 创建 formidable 实例const form = new formidable.IncomingForm();form.parse(req, (err, fields, files) =>{// 传递的参数都在 fields 中  res.send(fields)})
})

1.2 FormData实现二进制文件上传

  • 下面的样式用到了bootstrap,不导入也没影响…
  • 思路如下:
  1. 获取input表单元素,并监听它的改变事件(file.onchange)
  2. 当input改变时,创建一个FormData实例(new FormData())
  3. 将上传的文件添加到实例中(formData.append())
  4. 将文件上传到服务器(xhr.send)
  5. 服务器端接收到上传的文件,将其保存在/public/uploads
  6. 服务器返回ok

1.2.1 文件上传的表单控件

<div class="container"><div class="form-group"><label>请选择文件</label><input type="file" id="file" />
</div>

1.2.2 [客户端]文件上传

<script type="text/javascript">var file = document.getElementById('file');// 监听文件上传file.onchange = function(){var formData = new FormData();// 将文件的二进制信息(files)放在formData载体中,并取名classNameformData.append('className', this.files[0]);var xhr = new XMLHttpRequest();xhr.open('post', 'http://localhost:3000/uploads');xhr.send(formData);xhr.onload = function () {// 上传成功,收到服务器端的响应if(xhr.status == 200){console.log(xhr.responseText);}}}
</script>

1.2.3 [服务端]文件上传

  • 服务端监听路由upload
  • 使用formidable,来获取传递的表单参数
  • 设置保存的路径form.uploadDir
  • 返回信息
const express = require('express');
const formidable = require('formidable');
const path = require('path');
const app = express();
app.post('/upload', (req, res)=>{const form = new formidable.IncomingForm();// 配置表单的属性form.uploadDir = path.join(__dirname, 'public', ''); // 文件存储在服务端的路径form.keepExtensions = true; // 文件保留后缀名// 表单接收 客户端的 FormData 参数form.parse(req,(err, fields, files)=>{res.send('ok')})
})

2. 参考

源代码

javascript --- [FormData的使用] 表单元素转换成表单 对象二进制文件上传相关推荐

  1. HTML5+jSignature插件手写签名生成图片并转换成文件流实现服务器上传功能

    简介 项目结构:html+vue+springboot html引入VUE项目vue.min.js.jQuery的jquery-3.4.1.min.js,签名:modernizr.js.jSignat ...

  2. 微信小程序云开发 把时间戳转换成正常的时间格式上传到数据库中

    一.utils文件里面建一个utils.js文件(内容如下) 目录 一.utils文件里面建一个utils.js文件(内容如下) 二.在上传用户详情信息的界面最上方标注 三,在上传的函数中 四.结果 ...

  3. HTML基本语法之表单标签:表单的组成 ,表单域,表单控件元素(表单元素) ,input表单元素, label标签, 表单控件(表单元素), select表单元素, textarea表单元素

    文章目录 表单标签 表单的组成 表单域 常用属性: 表单控件元素(表单元素) input表单元素 label标签 表单控件(表单元素) select表单元素 textarea表单元素 表单元素几个总结 ...

  4. 24.shell中list详解,定义list,获取List的总个数,获取list的某个元素值,将list的每个元素转换成以空格分隔的字符串,空格分隔的字符串转换成list,for循环list

    文章目录 前言 定义list 获取List的总个数 获取list的某个元素值 将list的每个元素转换成以空格分隔的字符串 空格分隔的字符串转换成list for循环list 总结 友情链接 前言 s ...

  5. linux 串口 字符 间隔,嵌入式linux编程过成中模块从串口读数需要特定的字符段并且需要每两位字符数组元素转换成一个16进制数(提取特定字符串+字符串转16进制)...

    嵌入式linux编程过成中用到zigbee模块 zigbee从串口读数需要特定的字符段并且需要每两位字符数组元素转换成一个16进制数 (提取特定字符串+字符串转16进制) #include #incl ...

  6. 嵌入式linux编程过成中模块从串口读数需要特定的字符段并且需要每两位字符数组元素转换成一个16进制数(提取特定字符串+字符串转16进制)

    嵌入式linux编程过成中用到zigbee模块 zigbee从串口读数需要特定的字符段并且需要每两位字符数组元素转换成一个16进制数 (提取特定字符串+字符串转16进制) #include<st ...

  7. gson java 对象_Gson把json串转换成java实体对象

    Gson把json串转换成java实体对象的方法如下: 1.首先导入Gson的jar包,网上可以下载. java实体对象如下: public class Model { private double ...

  8. html5新增了哪些表单元素,HTML5新增表单元素

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? HTML5新增表单元素主要有 input标签 其type类型主要有有以下几种:type="tel"用 ...

  9. HTML给表单元素赋值,JQuery表单元素取值赋值方法总结

    一.普通文本框的赋值与取值 1.1.1赋值 jQuery 表单元素取值与赋值方法总结 function get(){ var test1 = $("input.test1").va ...

最新文章

  1. How to set window title name on Oracle EBS Form?
  2. 网管日志-06.08.14
  3. 部队文职计算机试题,2020军队文职人员考试:计算机基础模拟试题(1)
  4. 关于一些运算((与运算)、|(或运算)、^(异或运算)........)的本质理解【转】...
  5. C++利用访函数进行选择排序
  6. [Luogu] P1939 【模板】矩阵加速(数列)
  7. python pow和**_第005篇:Python中的数字
  8. python计算生态规模_Python计算生态的构建
  9. 数据科学家最常用的十种算法和方法
  10. 公式字符串转换为公式或结果
  11. 使用Git上传文件至Github中
  12. python常用中文分词方法_中文分词原理及常用Python中文分词库介绍
  13. 搭建服务器处理系统(基于netty),基于Netty的农业物联网服务器系统设计.PDF
  14. Python绘制简单折线图、散点图
  15. Unity手游优化总概
  16. 网络嗅探器 java_网络嗅探软件的设计与分析
  17. 三跨考研浙江大学计算机,“三跨”考研的焦虑 你能承受多少
  18. linux进程调度算法,关于嵌入式Linux系统实时进程调度算法系统详解
  19. 23.文件特殊权限之SUID权限、SGID权限、Sticky BIT权限和ACL权限
  20. oracle udt 解析,UDT协议实现分析总结

热门文章

  1. mysql设置定位慢查询_mysql优化——定位慢查询
  2. c++ map 析构函数_C++|类继承关系中的虚函数、虚析构函数、虚基类
  3. python写mapreduce_用python写MapReduce函数——以WordCount为例
  4. python从list中取出连续的数_python list 中找连续的数字(由网友处学习)
  5. GPU Gems1 - 21 实时辉光(Real-Time Glow)
  6. 计算机视觉应关注的资源
  7. 基于SOA的银行系统架构
  8. web提高:负载均衡
  9. 【CUDA开发】CUDA面内存拷贝用法总结
  10. Delphi通过ICMP检测与远程主机连接