File API FileReader与FileReaderSync
标签实现
<input type="file" id="files" />
获取被选择的文件的基础信息
属性 | 作用 |
---|---|
name | 被选中文件的文件名 |
size | 文件大小(单位:字节byte) |
type | 文件类型(image,text等) |
lastModifiedDate | 当前文件最后修改完成时的事件字符串,一般指上传完成时间(Fri Jun 11 2021 21:31:50 GMT+0800 (中国标准时间)) |
代码实现
let GetFiles = document.getElementById('files')
//此处监听change事件,文件内容发生改变就触发
GetFiles.addEventListener("change", (event) => {
let files = event.terget.files
, index = 0
, len = files.length
while(i < len) {
console.log(
files[i].name
, files[i],type
, files[i].size
, files[i].lastModifiedDate
)
}
})
到这里为止,都还是些文件相关的文本信息,还不能真的拿到文件
真正的拿文件 FileReader(),异步的
文件读取后的保存方式
假设此时已经通过input type="file"标签选择了一个文件,并复制给File
属性 | 作用 |
---|---|
readAsText | 将File以文本格式保存在result属性中 |
readAsDataURL | 将File以base64字符串形式保存在result属性中 |
readAsBinaryString | 将File以二进制字符形式保存在result属性中 |
readAsArrayBuffer | 将File以ArrayBuffer形式保存在result属性中 |
记住:结果都保存在result属性中
FileReader最重要的3个事件 | 名称 |
---|---|
progress | 读取进度,每5毫秒触发一次 |
error | 读取发生错误,发生错误时触发 |
load | 成功读取完成时触发 |
<div id="output"></div>
<div id="progress"></div>
let GetFiles = document.getElementById('files')
GetFiles.addEventListener("change", (event) => {
//展示上传文件的div
let output = document.getElementById('output')
//展示上传进度的div
, progress = document.getElementById('progress')
//上传的若干文件
, files = event.target.files
//上传文件的类型
, type = 'default'
创建FileReader实例
, reader = new FileReader()
//判断读取文件类型,并按类型转换
if (/image/.test(files[0].type)) {
//转成可读的base64字符串
reader.readAsDataURL(files[0])
console.log(files[0].lastModifiedDate);
type = 'image'
} else {
//转成文本
reader.readAsText(files[0])
type = 'text'
}
//若读取发生错误
reader.onerror = function () {
output.innerHTML = 'Could not read file'
}
//展示读取进程
reader.onprogress = function (event) {
//event.lengthComputable,进程是否可以计算长度:boolen,若不能计算长度则event.total无意义;此属性兼容性差
if (event.lengthComputable) {
progress.innerHTML = `${event.loaded} / ${event.total}`
}
}
//读取成功后在output中展示文件
reader.onload = function () {
let html = ''
switch (type) {
case 'image':
html = `<img src="${reader.result}" />`
break
case 'text':
html = reader.result
break
}
output.innerHTML = html
}
})
FileReaderSync同步的,可以读取指定的Blob和File对象中的内容,返回一个ArrayBuffer对象,里面包含了被读取文件的内容数据。如果在读取过程中发生了错误,则会抛出相关的异常。
但是只能在workes里用,因为在主线程里进行同步I/O操作可能会阻塞用户界面。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY