FormData 对象详解
FormData是Ajax2.0(XMLHttpRequest Level2)提供的一种将form表单元素name和value组合成键值,实现表单数据的序列化,从而减少from表单元素的拼接,提高工作效率对的接口,以方便将form表单数据通过XMLHttpRequest.send() 方法发送到后端,可以使用该对象来处理form表单元素并方便的进行文件上传。
FormData 方法
formData.append(name, value)
—— 添加具有给定 name 和 value 的表单字段,formData.append(name, blob, fileName)
—— 添加一个字段,就像它是<input type="file">
,第三个参数 fileName 设置文件名(而不是表单字段名),因为它是用户文件系统中文件的名称,formData.delete(name)
—— 移除带有给定 name 的字段,formData.get(name)
—— 获取带有给定 name 的字段值,formData.has(name)
—— 如果存在带有给定 name 的字段,则返回 true,否则返回 false。
从技术上来讲,一个表单可以包含多个具有相同 name 的字段,因此,多次调用 append 将会添加多个具有相同名称的字段。
还有一个 set 方法,语法与 append 相同。不同之处在于 .set 移除所有具有给定 name 的字段,然后附加一个新字段。因此,它确保了只有一个具有这种 name 的字段,其他的和 append 一样:
formData.set(name, value)
,formData.set(name, blob, fileName)
。
发送带有文件的表单
表单始终以 Content-Type: multipart/form-data
来发送数据,这个编码允许发送文件。因此 <input type="file">
字段也能被发送,类似于普通的表单提交。
<form id="formElem">
<input type="text" name="firstName" value="John">
Picture: <input type="file" name="picture" accept="image/*">
<input type="submit">
</form>
<script>
formElem.onsubmit = async (e) => {
e.preventDefault();
let response = await fetch('/article/formdata/post/user-avatar', {
method: 'POST',
body: new FormData(formElem)
});
let result = await response.json();
alert(result.message);
};
</script>
发送具有 Blob 数据的表单
使用 FormData
将一个来自 <canvas>
的图片和一些其他字段一起作为一个表单提交:
let imageBlob = await new Promise(resolve => canvasElem.toBlob(resolve, 'image/png'));
let formData = new FormData();
formData.append("firstName", "John");
formData.append("image", imageBlob, "image.png");
let response = await fetch('/article/formdata/post/image-form', {
method: 'POST',
body: formData
});
let result = await response.json();
alert(result.message);