一、FormData
XHR 2 添加了一个新的接口 FormData
,通过 FormData
对象里面的键值对可以模拟表单控件异步上传二进制文件。
append()
方法会添加一个新值到 FormData
对象内,若已存在也不会覆盖,可用 getAll()
方法取到指定键的所有值。delete()
方法会从 FormData
对象中删除指定键和它所有对应的值。
示例:
const fd = new FormData() // append fd.append('age', '24') fd.append('name', 'Mazey') fd.append('name', 'Cherrie') console.log(fd.get('name')) // Mazey console.log(fd.getAll('name')) // ["Mazey", "Cherrie"] // delete fd.delete('name') console.log(fd.getAll('name')) // []
也可以指定一个 Blob
或 File
作为数据添加到 FormData
对象中:fd.append('file', Blob Object, File Name)
或 fd.append('portrait', formInput.files[0], 'user.png')
。
二、Blob
Blob
对象表示一个不可变、原始数据的类文件对象。通过 URL
对象可以创建一个指向类型化数组的 URL,可以当成一个普通的链接使用,比如读取图片或者视频。
示例:
const blob = new Blob([JSON.stringify({hello: 'Mazey!'})], {type : 'application/json'}) const url = URL.createObjectURL(blob)
三、实战:使用 axios 上传一个 WebM 文件
备注:WebM 由 Google 提出,是一个开放、免费的媒体文件格式。
const blob = new Blob(Webm Object, {type: 'video/webm'}) const formData = new FormData() formData.append('file', blob, 'mazey-test.webm') axios({ method: 'post', url: '/api/video/upload', data: formData, headers: { 'Content-Type': 'multipart/form-data' } }) .then( res => { console.log('上传成功!') } ) .catch( err => { console.log('上传失败!') } )