axios+Vue实现上传文件显示进度功能


Posted in Javascript onApril 14, 2019

一,前言

最近在用Vue,然后上传文件时需要显示进度,于是网上搜了一下,经过自己实测终于也弄明白了

二,效果

axios+Vue实现上传文件显示进度功能

三,代码

HTML代码

<div id="app">
<h4>上传文件:</h4>
   <p class="input-zone">
    <span v-if="filename">{{filename}}</span>
    <span v-else>+请选择文件上传+</span>
 <input type="file" name="file" value="" placeholder="请选择文件" @change="upload" multiple="multiple" />
   </p>
  <p>上传进度:</p>
   <div class="progress-wrapper">
    <div class="progress-progress" :style="uploadStyle"></div>
    <div class="progress-rate">{{(uploadRate*100).toFixed(2)}}%</div>
   </div>
  </div>

CSS代码

.input-zone { width: 500px; color: blue; font-size: 14px; position: relative; }
   .input-zone input[type='file'] { opacity: 0; width: 100%; height: 100%; position: absolute; left: 0; top: 0; z-index: 2; }
  .progress-wrapper { position: relative; height: 50px; border-radius: 5px; background-color: lightgrey; }
   .progress-wrapper .progress-progress { position: absolute; left: 0; top: 0; height: 100%; width: 0%; border-radius: 5px; background-color: darkturquoise; z-index: 1; }
   .progress-wrapper .progress-rate { position: relative; text-align: center; font-size: 14px; line-height: 50px; height: 100%; z-index:2;}

JS代码

var app = new Vue({
   el: "#app",
   data: {
    uploadRate: 0,
    filename: '',
    uploadStyle: {
     width: '0%'
    }
   },
   methods: {
    upload: function (e) {
     var vm = this;
     var formData = new FormData();
     formData.append("name", "Alax");
     for (var i = 0; i < e.target.files.length; i++) {
      var file = e.target.files[i]; //取第1个文件
      formData.append("file", file);
      vm.filename = file.name;
      console.log(file);
     }
     var config = {
      headers: { 'Content-Type': 'multipart/form-data' },
      onUploadProgress: function (e) {
       console.log("进度:");
       console.log(e);
       //属性lengthComputable主要表明总共需要完成的工作量和已经完成的工作是否可以被测量
       //如果lengthComputable为false,就获取不到e.total和e.loaded
       if (e.lengthComputable) {
        var rate = vm.uploadRate = e.loaded / e.total; //已上传的比例
        if (rate < 1) {
         //这里的进度只能表明文件已经上传到后台,但是后台有没有处理完还不知道
         //因此不能直接显示为100%,不然用户会误以为已经上传完毕,关掉浏览器的话就可能导致上传失败
         //等响应回来时,再将进度设为100%
         vm.uploadRate = rate;
         vm.uploadStyle.width = (rate *100).toFixed(2)+ '%';
        }
       }
      }
     };
     axios.post("/ajaxPage/VueUpload.aspx?method=upload", formData, config)
      .then(function (data) {
       console.log(data);
       var json = data.data; //后台实际返回的结果
       if (json.result) {
        vm.uploadRate = 1;
        vm.uploadStyle.width = '100.00%';
       } else {
        alert(json.msg);
       }
      })
      .catch(function (err) {
       console.log(err);
      });
    }
   }
  })

 四,总结

1.其实单文件上传和多文件上传的区别就是 input标签中多了一个属性

multiple="multiple"

2.onuploadprogress 事件中显示上传为100%并不准确,一定要等到响应回来才能认为完成了100%,不然用户此时关闭了浏览器的话,上传就失败了。或者有其它逻辑时,此时点提交,就会导致后台找不到上传的文件路径等问题。

总结

以上所述是小编给大家介绍的axios+Vue实现上传文件显示进度功能,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
js不是基础的基础
Dec 24 Javascript
javascript 面向对象全新理练之数据的封装
Dec 03 Javascript
javascript 弹出层组件(升级版)
May 12 Javascript
JQuery给元素添加/删除节点比如select
Apr 02 Javascript
JQuery替换DOM节点的方法
Jun 11 Javascript
继续学习javascript闭包
Dec 03 Javascript
Angular2搜索和重置按钮过场动画
May 24 Javascript
bootstrap3-dialog-master模态框使用详解
Aug 22 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
Sep 04 Javascript
vue自定义标签和单页面多路由的实现代码
May 03 Javascript
JavaScript监听键盘事件代码实现
Jun 03 Javascript
vue中echarts图表大小适应窗口大小且不需要刷新案例
Jul 19 Javascript
Vue 使用formData方式向后台发送数据的实现
Apr 14 #Javascript
说说如何使用Vuex进行状态管理(小结)
Apr 14 #Javascript
基于Vue2-Calendar改进的日历组件(含中文使用说明)
Apr 14 #Javascript
浅谈Vue页面级缓存解决方案feb-alive(上)
Apr 14 #Javascript
vue 实现小程序或商品秒杀倒计时
Apr 14 #Javascript
js中async函数结合promise的小案例浅析
Apr 14 #Javascript
详解Vue-cli3 项目在安卓低版本系统和IE上白屏问题解决
Apr 14 #Javascript
You might like
浅析Yii中使用RBAC的完全指南(用户角色权限控制)
2013/06/20 PHP
浅析PHP绘图技术
2013/07/03 PHP
php.ini中的request_order推荐设置
2015/05/10 PHP
PHP函数实现从一个文本字符串中提取关键字的方法
2015/07/01 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
2015/12/14 PHP
YII Framework框架教程之国际化实现方法
2016/03/14 PHP
javascript 面向对象编程基础:封装
2009/08/21 Javascript
IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)
2011/08/28 Javascript
js判断生效时间不得大于失效时间的思路及代码
2013/04/23 Javascript
Javascript中判断变量是数组还是对象(array还是object)
2013/08/14 Javascript
探讨JQUERY JSON的反序列化类 using问题的解决方法
2013/12/19 Javascript
jquery 显示*天*时*分*秒实现时间计时器
2014/05/07 Javascript
多种js图片预加载实现方式分享
2016/02/19 Javascript
深入理解Node.js中的进程管理
2017/03/13 Javascript
Three.js实现浏览器变动时进行自适应的方法
2017/09/26 Javascript
完美解决mui框架off-canvas侧滑超出部分隐藏无法滚动的问题
2018/01/25 Javascript
AntV F2和vue-cli构建移动端可视化视图过程详解
2019/10/08 Javascript
继承行为在 ES5 与 ES6 中的区别详解
2019/12/24 Javascript
[02:43]DOTA2亚洲邀请赛场馆攻略——带你走进东方体育中心
2018/03/19 DOTA
Python用sndhdr模块识别音频格式详解
2018/01/11 Python
详解python中的Turtle函数库
2018/11/19 Python
深入浅析Python中的迭代器
2019/06/04 Python
python pandas时序处理相关功能详解
2019/07/03 Python
Django 创建新App及其常用命令的实现方法
2019/08/04 Python
Pytorch保存模型用于测试和用于继续训练的区别详解
2020/01/10 Python
Python 时间戳之获取整点凌晨时间戳的操作方法
2020/01/28 Python
详解python日志输出使用配置文件格式
2021/02/10 Python
CSS3教程(5):网页背景图片
2009/04/02 HTML / CSS
瑰珀翠美国官网:Crabtree & Evelyn美国
2016/11/29 全球购物
墨尔本复古时尚品牌:Dangerfield
2018/12/12 全球购物
大学考试作弊检讨书
2014/01/30 职场文书
宣传工作经验材料
2014/06/02 职场文书
中学生检讨书范文
2014/11/03 职场文书
教师学期末个人总结
2015/02/13 职场文书
给朋友的道歉短信
2015/05/12 职场文书
如何才能写好调研报告?
2019/07/03 职场文书