标签实现
<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(),异步的
文件读取后的保存方式
属性 | 作用 |
---|---|
readAsText | 读取,以文本格式保存在result属性中 |
readAsDataURL | 读取文件,将内容的数据URI保存在result属性中 |
readAsBinaryString | 将文件的每个二进制字符保存在result属性中 |
readAsArrayBuffer | 读取,并将文件内容以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)) {
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操作可能会阻塞用户界面。