vue获取上传进度_文件上传与读取实时进度展示-demo(Vue)
监听进程的方法onprogress
1 )文件读取的progress事件属于FileReader对象。
2 )下载的progress事件属于XMLHttpRequest对象。
3 )上传的progress事件属于XMLHttpRequest.upload对象。
本案例主要实现了文件读取、文件上传进度的可视化显示
demo功能
可添加并上传多个文件,每添加一个文件,会进行读取与上传,上传后存储文件与文件信息缓存于files数组中;
文件添加后,先显示读取进度条,读取100%后开始上传并显示上传进度条;
读取文件时,文件标题会显示文件读取中...,进度条为文件读取进度;
上传文件时,文件标题更新为具体文件名称与已上传的实时数据量,动态更新上传量,进度条为上传进度;
上传完毕,自动隐藏进度条;
注意点1:页面上只有一个input[type=file]框,但为了存储多个文件的二进制数据,这里将二进制数据缓存到files数组中,input[type=file]框只作为实时数据的处理使用;
注意点2:读取进度在实际应用中是可以省略的,本demo中读取后会将文件二进制数据缓存如files数组中,如果省略这步,可以不用读取文件。在这里主要用于体验文件读取进度的显示和缓存数据;
页面与样式
文件读取中...
{{ file.fileName }}({{ file.uploadSize}})
Add attachment
复制代码
background-color: #f2f2f2;
border-radius: 4px;
overflow: hidden;
border: 1px solid #ddd;
padding-left: 0;
}
ul::before {
content: 'Attachment';
height: 32px;
line-height: 32px;
display: block;
padding-left: 11px;
}
ul li.file_item {
margin-bottom: 1px;
}
ul li {
list-style: none;
position: relative;
background-color: #fff;
height: 32px;
padding-left: 11px;
overflow: hidden; /* 解决margin塌陷 */
}
ul li .file_name {
font-size: 14px;
color: #111;
font-weight: bolder;
line-height: 32px;
position: absolute;
}
ul li .del {
position: absolute;
right: 8px;
top: 6px;
font-size: 19.8px;
width: 19.8px;
height: 19.8px;
cursor: pointer;
padding: 0;
border: 0;
color: #666;
}
.progress_bar {
background-color: #fff;
border-radius: 100px;
overflow: hidden;
margin: 12px 166px 12px 206px;
border: 1px solid #ddd;
line-height: 8px;
height: 8px;
/* font-size: 14px; */
clear: both;
opacity: 1;
-moz-transition: opacity 1s linear;
-o-transition: opacity 1s linear;
-webkit-transition: opacity 1s linear;
}
.progress_bar.loading {
opacity: 1.0;
}
.progress_bar .percent, .progress_bar .upload {
background-color: #aaa;
height: 100%;
width: 0;
}
复制代码
方法实现
每选择一次文件,files数组中添加一项占位,视图更新显示该条数据处理情况;
handleFileSelect(e) {
// 加入this.files
this.files.push({})
this.$nextTick(tick=>{
this.getFile(e.target)
})
},
复制代码
读取文件后显示文件名
getFile(target) {
if (!target.files[0]) return;
let filevalue = target.value;
let index = filevalue.lastIndexOf('.');
let file = {}
file.fileName = target.files[0].name
file.filesExtension = filevalue.substring(index)
let self = this
this.readFile(target.files[0]).then(res => {
file.fileData = res // 缓存读取的二进制数据
Object.assign(self.files[self.files.length - 1], {
fileName: file.fileName, // 文件名
filesExtension: file.filesExtension, // 扩展名
fileData: file.fileData,
readPercent: '100%'
})
self.upload(target.files[0])
self.$forceUpdate()
}).catch(e => {
console.log(e)
})
},
复制代码readFile(file) {
let self = this;
return new Promise(function(resolve, reject){
let fileCard = self.files[self.files.length - 1];
// 在选择新文件后重置进度指示器
self.$set(fileCard, 'readPercent', '0%');
let reader = new FileReader();
reader.onprogress = self.updateProgress; // 更新进度条
reader.onerror = function (e){
switch(e.target.error.code) {
case e.target.error.NOT_FOUND_ERR:
reject('文件没找到');
break;
case e.target.error.NOT_READABLE_ERR:
reject('文件不可读');
break;
default:
reject('读取文件时出错');
};
}
reader.onloadend = function (res){
// 确保进度条最后显示100%
self.$set(fileCard, 'readPercent', '100%');
resolve(res.target.result)
}
// 将文件作为二进制数组读入
reader.readAsArrayBuffer(file);
})
},
复制代码
监听读取文件进度条
updateProgress(e) {
// e 是一个 ProgressEvent.
if (e.lengthComputable) {
let percentLoaded = ((e.loaded / e.total) * 100).toFixed(2);
let fileCard = this.files[this.files.length - 1];
this.$set(fileCard, 'fileSize', this.renderSize(e.loaded))
// 更新进度条长度
if (percentLoaded < 100) {
this.$set(fileCard, 'readPercent', percentLoaded+ '%');
}
}
},
复制代码
上传文件并监听上传进度
upload(fileObj) {
let formFile = new FormData();
formFile.append("attachment", fileObj); //加入文件对象
let fileCard = this.files[this.files.length - 1];
$.ajax({
url: window.location.origin + '/upload',
data: formFile,
type: "post",
dataType: "json",
cache: false,//上传文件无需缓存
processData: false,//用于对data参数进行序列化处理 这里必须false
contentType: false, //必须
xhr: () => {
let xhr = $.ajaxSettings.xhr();
if (xhr.upload) {
xhr.upload.onprogress = (e) => {
let percent=e.loaded/e.total;//文件上传百分比
if (percent <= 1) {
this.$set(fileCard, 'uploadPercent', (percent * 100).toFixed(2) + '%')
this.$set(fileCard, 'uploadSize', this.renderSize(e.loaded))
}
};
}
return xhr;
},
error: (error) => {
console.log(error)
},
success: (result) => {
this.$set(fileCard, 'uploadPercent', '100%')
this.$set(fileCard, 'filePath', result.file.filepath) // 添加接口返回的文件信息,如果没有可以忽略
},
complete: ()=> {
this.clearFile() // 上传完毕清空input[type=file]
}
})
},
复制代码
清空input[type=file]
clearFile() {
this.$refs.file.value = ''
},
复制代码
文件大小的“可视化”,把比特值换算成常用单位显示
renderSize(value){
if(null==value||value==''){
return "0 Bytes";
}
let unitArr = new Array("Bytes","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB");
let index=0;
let srcsize = parseFloat(value);
index=Math.floor(Math.log(srcsize)/Math.log(1024));
let size =srcsize/Math.pow(1024,index);
size=size.toFixed(2);//保留的小数位数
return size+unitArr[index];
},
复制代码
删除文件
del(n) {
this.files.splice(n, 1)
},
复制代码
demo下载
体验要点
由于我的demo是本地服务器,上传速度会比较快。而且真实的上传和文件读取速度可能比你想象的要快,所以小文件的进度可能会一闪而过。
【建议:可以将网络调成slot3G,这样多数文件上传进度就都可以看到了。至于文件读取进度,需要上传较大的文件才可以看到。】
另外,建议测试完毕后,清空upload文件件里上传的文件,并且清空废纸篓/回收站。避免给电脑存储增加负担。
欢迎指教
即学即分享,还请各位大佬多多指出优化与问题,我才能进步!
vue获取上传进度_文件上传与读取实时进度展示-demo(Vue)相关推荐
- java 文件上传漏洞_文件上传漏洞(绕过姿势)
文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接.但是想真正把这个漏洞利用好却不那么容易,其中有很多技巧,也有很多需要掌握的知识.俗话说,知己知彼方能百战不殆,因此 ...
- java 文件上传漏洞_文件上传漏洞(File Upload)
简介 File Upload,即文件上传漏洞,通常是由于对用户上传文件的类型.内容没有进行严格的过滤.检查,使得攻击者可以通过上传木马,病毒,恶意脚本等获取服务器的webshell权限,并进而攻击控制 ...
- 上传截断_文件上传路径截断实例
上传截断pass-13(post00截断):白名单,文件上传路径拼接生成,而且使用了post发送的数据进行拼接,我们可以控制post数据进行0x00截断绕过白名单(这里使用的是php5.2.17+ap ...
- bootstrapinput传参数_***文件上传控件bootstrap-fileinput的使用和参数配置说明
特别注意: 引入所需文件后页面刷新查看样式奇怪,浏览器提示错误等,可能是因为js.css文件的引用顺序问题,zh.js需要在fileinput.js后面引入.bootstrap最好在fileinput ...
- webuploader html5,在Vue项目中使用WebUploader实现文件上传
简介: WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流 ...
- Struts2_3_国际化处理_自定义拦截器_文件上传及下载_OGNL
Struts2国际化处理 浏览器根据当前的语言环境自动查找对应的语言环境资源包, 使jsp显示合适的语言数据环境 Struts2实现国际化, 动作类必须继承ActionSupport 创建资源包 资源 ...
- iHRM 人力资源管理系统_第9章_文件上传与PDF报表入门_第二节_PDF报表入门
iHRM 人力资源管理系统_第9章_文件上传与PDF报表入门_第二节_PDF报表入门 文章目录 iHRM 人力资源管理系统_第9章_文件上传与PDF报表入门_第二节_PDF报表入门 PDF报表入门 3 ...
- 前后端分离 -- 深入浅出 Spring Boot + Vue + ElementUI 实现相册管理系统【文件上传 分页 】 文件上传也不过如此~
前后端分离 – 深入浅出系列 Spring Boot + Vue + ElementUI 实现相册管理系统[文件上传 分页 ] 文件上传也不过如此~ 引言 Hello,我是Bug终结者,一名热爱后端J ...
- JS - 文件上传组件WebUploader使用详解1(带进度的文件上传
一.基本介绍 1,什么是 WebUploader? WebUploader 是由百度公司团队开发的一个以 HTML5 为主,FLASH 为辅的现代文件上传组件. 官网地址:http://fex.bai ...
最新文章
- WP8:Unity3D之间的值传递
- wamp下php无法保存SESSION问题总汇
- linux构建web主机
- Web- HTML网页颜色大全
- python中封装一个枚举_JavaScript可扩展枚举封装
- C#三层开发做学生管理系统
- 网络数据的背后-网络日志的分析指标【转】
- Django之中间件,csrf跨站伪造请求,auth认证模块
- 计算机学院辩论队,计算机学院新生辩论赛圆满落幕
- Elasticsearch模块功能之-索引分片分配(Index shard allocation)
- springboot-redis读取配置文件
- 聊天社交即时通信源码IM 群聊/语音/视频/红包支付/不依赖第三方sdk即时通讯
- Python中文社区开源项目计划:ImagePy
- 记一次流量分析实战——安恒科技(八月ctf)
- 【Vmware】 CentOS 8 安装教程
- 用计算机来解锁密码,电脑忘记开机密码怎么办?如何解锁?
- MySQL中的周(WEEK、YEARWEEK)
- kvm虚拟机扩展磁盘空间
- 心通达OA系统的研发源自2001年,距今已有21年的历史沉淀
- 看着大公司送的中秋礼物,我酸了。
热门文章
- linux alignment总结
- 金蝶K3 11.0-K3HR系统在Win2003环境的设置指南
- uml聊天系统服务器端类图,聊天系统服务器端类图
- Torch优化训练的17种方法
- 前台js实现附件比如word或者pdf的预览
- 省常中NOIP模拟 孤独 loneliness
- 浏览器播放视频没声音
- 毛概多项选择题答案统计程序
- 跟苹果学习如何开好一场产品发布会
- android马达测试,MotorTest(马达测试)手机版-MotorTest(马达测试)安卓版下载v1.31-领航下载站...