获取上传文件的base64
- 利用FileReader可以读取传输的数据,包括blob对象或file对象
- readAsDataURL是FileReader实例对象的方法,使读取结果为base64的格式
FileReader函数, 读取Blob,他有3个读取的方式,分别生成ArrayBuffer,base64字符串,文本(readAsDataURL生成base64)
<input id="input" type="file" /><script>const input = document.querySelector('input[type=file]')input.addEventListener('change', () => {var reader = new FileReader()// readAsDataURL读取结果为base64reader.readAsDataURL(input.files[0])reader.onload = function (e) {console.log(e.target.result) // 该结果就是base64}})</script>
方式一:将base64转换为Blob对象,再将Blob对象转换为File文件
file对象的继承blob,
- file对象相对于blob多了两个属性:lastModifiedDate,name
- atob方法是window上的方法,可以将base64转换为字符串,另一个方法是btoa,将字符串转换为base64
Blob实例化接收两个参数,一个是数组,一个是配置对象
- 第一个数组是:是一个由ArrayBuffer, ArrayBufferView, Blob, DOMString 等对象构成的 Array ,或者其他类似对象的混合体,它将会被放进 Blob。
- 第二个参数:配置对象有两个属性,type和endings
// 将base64转换为blobfunction dataUrlToBlob(dataUrl) {let arr = dataUrl.split(',')let base64 = arr[1] // 获取base64let mime = arr[0].match(/:(.*?);/)[1] // 获取类型// 将base64转换为字符串let strBase64 = atob(base64)// 将字符串的每个字符对应的code存储起来let n = strBase64.lengthlet u8arr = new Uint8Array(n)while (n--) {u8arr[n] = strBase64.charCodeAt(n)}// 实例Blob的参数第一个必须是一个可迭代对象return new Blob([u8arr], { type: mime })}// 将blob转换成filefunction blobToFile(blob, name) {return new File([blob], name, { type: blob.type })}
方式二:将base64转换为File对象
File 对象代表一个文件,用来读写文件信息。它继承了 Blob 对象,或者说是一种特殊的 Blob 对象,所有可以使用 Blob 对象的场合都可以使用它。
File实例接收三个参数,第一个参数是数组,第二个参数是name,第三个参数是配置对象
- array:一个数组,成员可以是二进制对象或字符串,表示文件的内容。
- name:字符串,表示文件名或文件路径。
- options:配置对象,设置实例的属性。属性包括:
- type:字符串,表示实例对象的 MIME 类型,默认值为空字符串。
- lastModified:时间戳,表示上次修改的时间,默认为Date.now()。
// 将base64转换为File对象function dataUrlToFile(dataUrl, name) {let arr = dataUrl.split(',')let base64 = arr[1] // 获取base64let type = arr[0].match(/:(.*?);/)[1] // 获取类型// 将base64转换为字符串let strBase64 = atob(base64)// 将字符串的每一个字符的code存储起来let n = strBase64.lengthlet u8arr = new Uint8Array(n)while (n--) {u8arr[n] = strBase64.charCodeAt(n)}// 生成file实例return new File([u8arr], name, { type })// 使用u8arr.buffer也可以,必须要用[]包裹// return new File([u8arr.buffer], name, { type })}
测试代码
URL.createObjectURL 可以将一个Blob对象转换为url
const input = document.querySelector('input[type=file]')const img = document.querySelector('img')var base64input.addEventListener('change', () => {var reader = new FileReader()// readAsDataURL读取结果为base64reader.readAsDataURL(input.files[0])reader.onload = function (e) {base64 = e.target.result // 该结果就是base64console.log(base64)// let blob = dataUrlToBlob(base64)// console.log(blob)// let file = blobToFile(blob, 'hhh')// console.log(file)// let url = URL.createObjectURL(file)// console.log(url)let file = dataUrlToFile(base64, 'hhh')console.log(file)let url = URL.createObjectURL(file)img.src = url}})
