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 相关文章推荐
JavaScript 页面坐标相关知识整理
Jan 09 Javascript
jQuery timers计时器简单应用说明
Oct 28 Javascript
js 调用本地exe的例子(支持IE内核的浏览器)
Dec 26 Javascript
Jquery ajaxStart()与ajaxStop()方法(实例讲解)
Dec 18 Javascript
js和jquery设置disabled属性为true使按钮失效
Aug 07 Javascript
JS实现登录页面记住密码和enter键登录方法推荐
May 10 Javascript
每个程序员都需要学习 JavaScript 的7个理由小结
Sep 03 Javascript
原生js实现日期计算器功能
Feb 17 Javascript
vue router下的html5 history在iis服务器上的设置方法
Oct 18 Javascript
探索JavaScript中私有成员的相关知识
Jun 13 Javascript
vue中实现上传文件给后台实例详解
Aug 22 Javascript
vue中改变滚动条样式的方法
Mar 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
五款常用mysql slow log分析工具的比较分析
2011/05/22 PHP
php tp验证表单与自动填充函数代码
2012/02/22 PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
2013/01/23 PHP
纯PHP生成的一个树叶图片画图例子
2014/04/16 PHP
DOM基础及php读取xml内容操作的方法
2015/01/23 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
2020/08/17 PHP
JavaScript 学习笔记一些小技巧
2010/03/28 Javascript
jquery实现居中弹出层代码
2010/08/25 Javascript
Jquery截取中文字符串的实现代码
2010/12/22 Javascript
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
2012/07/31 Javascript
javascript跨域的方法汇总
2015/10/23 Javascript
微信小程序 富文本转文本实例详解
2016/10/24 Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
2017/03/30 Javascript
Node.js readline 逐行读取、写入文件内容的示例
2018/03/01 Javascript
JS常见面试试题总结【去重、遍历、闭包、继承等】
2019/08/27 Javascript
解决echarts 一条柱状图显示两个值,类似进度条的问题
2020/07/20 Javascript
如何阻止移动端浏览器点击图片浏览
2020/08/29 Javascript
[50:28]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs KG
2018/04/01 DOTA
Python实现约瑟夫环问题的方法
2016/05/03 Python
利用Python批量生成任意尺寸的图片
2016/08/29 Python
python将字典内容存入mysql实例代码
2018/01/18 Python
python format 格式化输出方法
2018/07/16 Python
django mysql数据库及图片上传接口详解
2019/07/18 Python
对Pytorch神经网络初始化kaiming分布详解
2019/08/18 Python
Python filter过滤器原理及实例应用
2020/08/18 Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
2021/02/18 Python
HTML5实现表单自动验证功能实例代码
2017/01/11 HTML / CSS
美国最大的农村生活方式零售店:Tractor Supply Company(TSC)
2017/05/15 全球购物
Whistles官网:英国女装品牌
2020/08/14 全球购物
民主生活会对照检查材料思想汇报
2014/09/27 职场文书
2015关于重阳节的演讲稿
2015/03/20 职场文书
python实现简单区块链结构
2021/04/25 Python
十大最强妖精系宝可梦,哲尔尼亚斯实力最强,第五被称为大力士
2022/03/18 日漫
instantclient客户端 连接oracle数据库
2022/04/26 Oracle
css清除浮动clearfix:after的用法详解(附完整代码)
2023/05/21 HTML / CSS