分片上传知识点
一.XMLHttpRequest.upload
XMLHttpRequest.upload 属性返回一个 XMLHttpRequestUpload对象,用来表示上传的进度。这个对象是不透明的,但是作为一个XMLHttpRequestEventTarget,可以通过对其绑定事件来追踪它的进度。
事件 | 相应属性的信息类型 |
---|---|
onloadstart |
获取开始 |
onprogress |
数据传输进行中 |
onabort |
获取操作终止 |
onerror |
获取失败 |
onload |
获取成功 |
ontimeout |
获取操作在用户规定的时间内未完成 |
onloadend |
获取完成(不论成功与否) |
二.formData
FormData 接口提供了一种表示表单数据的键值对 key/value 的构造方式,并且可以轻松的将数据通过XMLHttpRequest.send() 方法发送出去,本接口和此方法都相当简单直接。
-
如果送出时的编码类型被设为 "multipart/form-data",它会使用和表单一样的格式。
-
如果你想构建一个简单的GET请求,并且通过
-
实现了 FormData 接口的对象可以直接在for...of结构中使用,而不需要调用entries() : for (var p of myFormData) 的作用和 for (var p of myFormData.entries()) 是相同的。
使用
new FormData()
方法
方法名 | 描述
- | -
FormData.append()
| 向 FormData 中添加新的属性值,FormData 对应的属性值存在也不会覆盖原值,而是新增一个值,如果属性不存在则新增一项属性值。
FormData.delete()
| 从 FormData 对象里面删除一个键值对。
FormData.entries()
| 返回一个包含所有键值对的iterator对象。
FormData.get()
| 返回在 FormData 对象中与给定键关联的第一个值。
FormData.getAll()
| 返回一个包含 FormData 对象中与给定键关联的所有值的数组。
FormData.has()
| 返回一个布尔值表明 FormData 对象是否包含某些键。
FormData.keys()
| 返回一个包含所有键的iterator对象。
FormData.set()
| 给 FormData 设置属性值,如果FormData 对应的属性值存在则覆盖原值,否则新增一项属性值。
FormData.values()
| 返回一个包含所有值的iterator对象。
为什么只用formData(multipart/form-data)进行上传大文件
application/x-www-form-urlencoded是把数据使用url编码后传送给后端,不适合用于传输大型二进制数据或者包含非ASCII字符的数据,
application/json得到的只是一个描述性JSON对象,根本就不是一个文件对象。
如果说一定得需要用json来传递的话,那么就必须得把这个原生的file对象进行转码,例如:base64,然后后端在接收的时候按照json来解析,获取那一段字符串之后重新转码生成图像文件,过程确实繁琐了。