监听进程的方法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)相关推荐

  1. java 文件上传漏洞_文件上传漏洞(绕过姿势)

    文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接.但是想真正把这个漏洞利用好却不那么容易,其中有很多技巧,也有很多需要掌握的知识.俗话说,知己知彼方能百战不殆,因此 ...

  2. java 文件上传漏洞_文件上传漏洞(File Upload)

    简介 File Upload,即文件上传漏洞,通常是由于对用户上传文件的类型.内容没有进行严格的过滤.检查,使得攻击者可以通过上传木马,病毒,恶意脚本等获取服务器的webshell权限,并进而攻击控制 ...

  3. 上传截断_文件上传路径截断实例

    上传截断pass-13(post00截断):白名单,文件上传路径拼接生成,而且使用了post发送的数据进行拼接,我们可以控制post数据进行0x00截断绕过白名单(这里使用的是php5.2.17+ap ...

  4. bootstrapinput传参数_***文件上传控件bootstrap-fileinput的使用和参数配置说明

    特别注意: 引入所需文件后页面刷新查看样式奇怪,浏览器提示错误等,可能是因为js.css文件的引用顺序问题,zh.js需要在fileinput.js后面引入.bootstrap最好在fileinput ...

  5. webuploader html5,在Vue项目中使用WebUploader实现文件上传

    简介: WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流 ...

  6. Struts2_3_国际化处理_自定义拦截器_文件上传及下载_OGNL

    Struts2国际化处理 浏览器根据当前的语言环境自动查找对应的语言环境资源包, 使jsp显示合适的语言数据环境 Struts2实现国际化, 动作类必须继承ActionSupport 创建资源包 资源 ...

  7. iHRM 人力资源管理系统_第9章_文件上传与PDF报表入门_第二节_PDF报表入门

    iHRM 人力资源管理系统_第9章_文件上传与PDF报表入门_第二节_PDF报表入门 文章目录 iHRM 人力资源管理系统_第9章_文件上传与PDF报表入门_第二节_PDF报表入门 PDF报表入门 3 ...

  8. 前后端分离 -- 深入浅出 Spring Boot + Vue + ElementUI 实现相册管理系统【文件上传 分页 】 文件上传也不过如此~

    前后端分离 – 深入浅出系列 Spring Boot + Vue + ElementUI 实现相册管理系统[文件上传 分页 ] 文件上传也不过如此~ 引言 Hello,我是Bug终结者,一名热爱后端J ...

  9. JS - 文件上传组件WebUploader使用详解1(带进度的文件上传

    一.基本介绍 1,什么是 WebUploader? WebUploader 是由百度公司团队开发的一个以 HTML5 为主,FLASH 为辅的现代文件上传组件. 官网地址:http://fex.bai ...

最新文章

  1. WP8:Unity3D之间的值传递
  2. wamp下php无法保存SESSION问题总汇
  3. linux构建web主机
  4. Web- HTML网页颜色大全
  5. python中封装一个枚举_JavaScript可扩展枚举封装
  6. C#三层开发做学生管理系统
  7. 网络数据的背后-网络日志的分析指标【转】
  8. Django之中间件,csrf跨站伪造请求,auth认证模块
  9. 计算机学院辩论队,计算机学院新生辩论赛圆满落幕
  10. Elasticsearch模块功能之-索引分片分配(Index shard allocation)
  11. springboot-redis读取配置文件
  12. 聊天社交即时通信源码IM 群聊/语音/视频/红包支付/不依赖第三方sdk即时通讯
  13. Python中文社区开源项目计划:ImagePy
  14. 记一次流量分析实战——安恒科技(八月ctf)
  15. 【Vmware】 CentOS 8 安装教程
  16. 用计算机来解锁密码,电脑忘记开机密码怎么办?如何解锁?
  17. MySQL中的周(WEEK、YEARWEEK)
  18. kvm虚拟机扩展磁盘空间
  19. 心通达OA系统的研发源自2001年,距今已有21年的历史沉淀
  20. 看着大公司送的中秋礼物,我酸了。

热门文章

  1. linux alignment总结
  2. 金蝶K3 11.0-K3HR系统在Win2003环境的设置指南
  3. uml聊天系统服务器端类图,聊天系统服务器端类图
  4. Torch优化训练的17种方法
  5. 前台js实现附件比如word或者pdf的预览
  6. 省常中NOIP模拟 孤独 loneliness
  7. 浏览器播放视频没声音
  8. 毛概多项选择题答案统计程序
  9. 跟苹果学习如何开好一场产品发布会
  10. android马达测试,MotorTest(马达测试)手机版-MotorTest(马达测试)安卓版下载v1.31-领航下载站...