获取上传文件的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读取结果为base64
reader.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转换为blob
function dataUrlToBlob(dataUrl) {
let arr = dataUrl.split(',')
let base64 = arr[1] // 获取base64
let mime = arr[0].match(/:(.*?);/)[1] // 获取类型
// 将base64转换为字符串
let strBase64 = atob(base64)
// 将字符串的每个字符对应的code存储起来
let n = strBase64.length
let u8arr = new Uint8Array(n)
while (n--) {
u8arr[n] = strBase64.charCodeAt(n)
}
// 实例Blob的参数第一个必须是一个可迭代对象
return new Blob([u8arr], { type: mime })
}
// 将blob转换成file
function 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] // 获取base64
let type = arr[0].match(/:(.*?);/)[1] // 获取类型
// 将base64转换为字符串
let strBase64 = atob(base64)
// 将字符串的每一个字符的code存储起来
let n = strBase64.length
let 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 base64
input.addEventListener('change', () => {
var reader = new FileReader()
// readAsDataURL读取结果为base64
reader.readAsDataURL(input.files[0])
reader.onload = function (e) {
base64 = e.target.result // 该结果就是base64
console.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
}
})