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 相关文章推荐
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
Apr 12 Javascript
分享一些常用的jQuery动画事件和动画函数
Nov 27 Javascript
学习javascript面向对象 实例讲解面向对象选项卡
Jan 04 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
Jan 19 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
Apr 25 Javascript
Vue动态实现评分效果
May 24 Javascript
React 子组件向父组件传值的方法
Jul 24 Javascript
react-router 路由切换动画的实现示例
Dec 03 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
May 02 Javascript
微信小程序云开发 搭建一个管理小程序
May 17 Javascript
基于JS实现数字动态变化显示效果附源码
Jul 18 Javascript
JS实现的tab切换并显示相应内容模块功能示例
Aug 03 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
PHP的ASP防火墙
2006/10/09 PHP
php截取utf-8中文字符串乱码的解决方法
2010/03/29 PHP
深入理解PHP原理之Session Gc的一个小概率Notice
2011/04/12 PHP
php中过滤非法字符的具体实现
2013/10/29 PHP
去掉destoon资讯内容页keywords关键字自带的文章标题的方法
2014/08/21 PHP
dedecms中使用php语句指南
2014/11/13 PHP
PHP 500报错的快速解决方法
2016/12/14 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
2019/06/06 PHP
一个XML格式数据转换为图表的例子
2010/02/09 Javascript
jquery实现居中弹出层代码
2010/08/25 Javascript
JS对img标签进行优化使用onerror显示默认图像
2014/04/24 Javascript
javascript函数中参数传递问题示例探讨
2014/07/31 Javascript
jquery实现鼠标滑过小图查看大图的方法
2015/07/20 Javascript
jquery调整表格行tr上下顺序实例讲解
2016/01/09 Javascript
Vue封装一个简单轻量的上传文件组件的示例
2018/03/21 Javascript
在移动端使用vue-router和keep-alive的方法示例
2018/12/02 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
2019/04/30 Javascript
Vue 动态组件components和v-once指令的实现
2019/08/30 Javascript
详解React 元素渲染
2020/07/07 Javascript
js实现计算器功能
2020/08/10 Javascript
[43:32]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
解决pycharm无法调用pip安装的包问题
2018/05/18 Python
根据DataFrame某一列的值来选择具体的某一行方法
2018/07/03 Python
ZABBIX3.2使用python脚本实现监控报表的方法
2019/07/02 Python
详解pandas数据合并与重塑(pd.concat篇)
2019/07/09 Python
台湾菁英交友:结识黄金单身的台湾人
2018/01/22 全球购物
莫斯科制造商的廉价皮大衣:Fursk
2020/06/09 全球购物
小学生家长评语集锦
2014/01/30 职场文书
淘宝活动策划方案
2014/02/06 职场文书
学校领导班子对照检查材料
2014/09/24 职场文书
民主生活会剖析材料
2014/09/30 职场文书
党支部先进事迹材料
2014/12/24 职场文书
创业计划书之校园超市
2019/09/12 职场文书
Python实现排序方法常见的四种
2021/07/15 Python
Tomcat弱口令复现及利用
2022/05/06 Servers
JavaScript parseInt0.0000005打印5原理解析
2022/07/23 Javascript