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类 from qq
Nov 13 Javascript
表格 隔行换色升级版
Nov 07 Javascript
JavaScript中判断原生函数检查function是否是原生代码
Sep 09 Javascript
微信JS接口汇总及使用详解
Jan 09 Javascript
Jquery api 速查表分享
Jan 12 Javascript
JS实现的合并多个数组去重算法示例
Apr 11 Javascript
基于vue-router 多级路由redirect 重定向的问题
Sep 03 Javascript
详解Vue.js中引入图片路径的几种方式
Jun 17 Javascript
JavaScript实现省份城市的三级联动
Feb 11 Javascript
vue利用全局导航守卫作登录后跳转到未登录前指定页面的实例代码
May 19 Javascript
基于JavaScript实现猜数字游戏代码实例
Jul 30 Javascript
Vue ​v-model相关知识总结
Jan 28 Vue.js
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
兼容PHP5的PHP目录管理函数库
2008/07/10 PHP
php中session_unset与session_destroy的区别分析
2011/06/16 PHP
PHP字符编码问题之GB2312 VS UTF-8解决方法
2011/06/23 PHP
PHP判断远程url是否有效的几种方法小结
2011/10/08 PHP
PHP将session信息存储到数据库的类实例
2015/03/04 PHP
Windows Server 2008 R2和2012中PHP连接MySQL过慢的解决方法
2016/07/02 PHP
jQuery总体架构的理解分析
2011/03/07 Javascript
jQuery + Flex 通过拖拽方式动态改变图片的代码
2011/08/03 Javascript
javascript数组操作总结和属性、方法介绍
2014/04/05 Javascript
通过设置CSS中的position属性来固定层的位置
2015/12/14 Javascript
第五章之BootStrap 栅格系统
2016/04/25 Javascript
JavaScript中的prototype原型学习指南
2016/05/09 Javascript
jQuery多个版本和其他js库冲突的解决方法
2016/08/11 Javascript
jquery 中toggle的2种用法详解(推荐)
2016/09/02 Javascript
解决URL地址中的中文乱码问题的办法
2017/02/10 Javascript
JavaScript如何获取到导航条中HTTP信息
2017/10/10 Javascript
将jquery.qqFace.js表情转换成微信的字符码
2017/12/01 jQuery
vue配置请求本地json数据的方法
2018/04/11 Javascript
angular 组件通信的几种实现方式
2018/07/13 Javascript
移动端滑动切换组件封装 vue-swiper-router实例详解
2018/11/25 Javascript
回顾Javascript React基础
2019/06/15 Javascript
微信小程序渲染性能调优小结
2019/07/30 Javascript
原生js实现二级联动菜单
2019/11/27 Javascript
JavaScript实现tab栏切换效果
2020/03/16 Javascript
easy_install python包安装管理工具介绍
2013/02/10 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
2018/04/20 Python
python3+selenium实现126邮箱登陆并发送邮件功能
2019/01/23 Python
使用Python实现文字转语音并生成wav文件的例子
2019/08/08 Python
python制作朋友圈九宫格图片
2019/11/03 Python
Anaconda使用IDLE的实现示例
2020/09/23 Python
关于python tushare Tkinter构建的简单股票可视化查询系统(Beta v0.13)
2020/10/19 Python
详解CSS3 Media Queries中媒体属性的使用
2016/02/29 HTML / CSS
美国女性奢华品牌精品店:INTERMIX
2017/10/12 全球购物
彪马加拿大官网:PUMA加拿大
2018/10/04 全球购物
什么是数据抽象
2016/11/26 面试题
工程服务质量承诺书
2015/04/29 职场文书