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 setAttribute, getAttribute 在不同浏览器上的不同表现
Aug 05 Javascript
什么是cookie?js手动创建和存储cookie
May 27 Javascript
js判断输入字符串是否为空、空格、null的方法总结
Jun 14 Javascript
jQuery复制节点用法示例(clone方法)
Sep 08 Javascript
JavaScript每天必学之数组和对象部分
Sep 17 Javascript
BootStrap中
Dec 10 Javascript
JQuery中Ajax的操作完整例子
Mar 07 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
Mar 24 jQuery
JavaScrpt的面向对象全面解析
May 09 Javascript
vue.js如何将echarts封装为组件一键使用详解
Oct 10 Javascript
微信小程序实现顶部导航特效
Jan 28 Javascript
微信小程序实现时间戳格式转换
Jul 20 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动态创建Flash动画
2006/10/09 PHP
用 PHP5 轻松解析 XML
2006/12/04 PHP
thinkphp5.1框架容器与依赖注入实例分析
2019/07/23 PHP
PHP sdk文档处理常用代码示例解析
2020/12/09 PHP
Firefox window.close()的使用注意事项
2009/04/11 Javascript
js 表单验证方法(实用)
2009/04/28 Javascript
5款Javascript颜色选择器
2009/10/25 Javascript
javascript 原型继承介绍
2011/08/30 Javascript
javascript全局变量封装模块实现代码
2012/11/28 Javascript
关于JS判断图片是否加载完成且获取图片宽度的方法
2013/04/09 Javascript
JavaScript中几个重要的属性(this、constructor、prototype)介绍
2013/05/19 Javascript
js实现可折叠展开的手风琴菜单效果
2015/09/07 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
2016/02/19 Javascript
fullCalendar中文API官方文档
2017/02/07 Javascript
NodeJs模拟登陆正方教务
2017/04/28 NodeJs
简单的React SSR服务器渲染实现
2018/12/11 Javascript
CryptoJS中AES实现前后端通用加解密技术
2018/12/18 Javascript
jQuery中使用validate插件校验表单功能
2019/05/24 jQuery
Vue 自定义指令功能完整实例
2019/09/17 Javascript
vue 手机物理监听键+退出提示代码
2020/09/09 Javascript
vue实现选中效果
2020/10/07 Javascript
python服务器端收发请求的实现代码
2014/09/29 Python
Python最基本的数据类型以及对元组的介绍
2015/04/14 Python
对python list 遍历删除的正确方法详解
2018/06/29 Python
Python绘制的二项分布概率图示例
2018/08/22 Python
python变量命名的7条建议
2019/07/04 Python
python颜色随机生成器的实例代码
2020/01/10 Python
python的pip有什么用
2020/06/17 Python
获取CSDN文章内容并转换为markdown文本的python
2020/09/06 Python
CSS3制作缩略图的详细过程
2016/07/08 HTML / CSS
关于有小孩的离婚协议书
2014/10/26 职场文书
升学宴学生答谢词
2015/01/05 职场文书
2016年中学端午节主题活动总结
2016/04/01 职场文书
2016年公共机构节能宣传周活动总结
2016/04/05 职场文书
2019关于实习生工作安排及待遇的管理方案!
2019/07/16 职场文书
golang 实现Location跳转方式
2021/05/02 Golang