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 相关文章推荐
获取DOM对象的几种扩展及简写
Oct 09 Javascript
js格式化时间小结
Nov 03 Javascript
javascript函数自动执行常用方法汇总
Mar 28 Javascript
JS判断两个对象内容是否相等的方法示例
Apr 10 Javascript
vue动态生成dom并且自动绑定事件
Apr 19 Javascript
详解webpack + vue + node 打造单页面(入门篇)
Sep 23 Javascript
基于VUE.JS的移动端框架Mint UI的使用
Oct 11 Javascript
Vue 按键修饰符处理事件的方法
May 04 Javascript
JS执行控制之节流模式实例分析
Dec 21 Javascript
浅谈Vue的响应式原理
May 30 Javascript
一个手写的vue放大镜效果
Aug 09 Javascript
vue实现节点增删改功能
Sep 26 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 mssql扩展SQL查询中文字段名解决方法
2012/10/15 PHP
ajax返回值中有回车换行、空格的解决方法分享
2013/10/24 PHP
php中替换字符串中的空格为逗号','的方法
2014/06/09 PHP
php中session与cookie的比较
2015/01/27 PHP
php实现俄罗斯乘法实例
2015/03/07 PHP
JavaScript 核心参考教程 内置对象
2009/10/13 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
浅谈 javascript 事件处理
2015/01/04 Javascript
JS实现六边形3D拖拽翻转效果的方法
2016/09/11 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
2017/01/11 Javascript
vue 的keep-alive缓存功能的实现
2018/03/22 Javascript
详解Vue-cli3.X使用px2rem遇到的问题
2019/08/09 Javascript
微信小程序表单验证插件WxValidate的二次封装功能(终极版)
2019/09/03 Javascript
微信小程序返回箭头跳转到指定页面实例解析
2019/10/08 Javascript
微信小程序网络请求实现过程解析
2019/11/06 Javascript
[02:31]DOTA2帕克 英雄基础教程
2013/11/26 DOTA
python统计字符串中指定字符出现次数的方法
2015/04/04 Python
在Mac OS上使用mod_wsgi连接Python与Apache服务器
2015/12/24 Python
Python实现字符串格式化的方法小结
2017/02/20 Python
python ddt数据驱动最简实例代码
2019/02/22 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
Python代码生成视频的缩略图的实例讲解
2019/12/22 Python
windows下python安装pip方法详解
2020/02/10 Python
python多维数组分位数的求取方式
2020/03/03 Python
Python Flask上下文管理机制实例解析
2020/03/16 Python
python plt可视化——打印特殊符号和制作图例代码
2020/04/17 Python
Python函数必须先定义,后调用说明(函数调用函数例外)
2020/06/02 Python
Python如何用wx模块创建文本编辑器
2020/06/07 Python
利用canvas实现图片下载功能来实现浏览器兼容问题
2019/05/31 HTML / CSS
中国包裹转运寄送国际服务:Famiboat
2019/07/24 全球购物
英语专业毕业个人求职自荐信
2013/09/21 职场文书
新任教师自我鉴定
2014/02/24 职场文书
大学生会计职业生涯规划范文
2014/02/28 职场文书
入党积极分子十八届四中全会思想汇报
2014/10/23 职场文书
会议接待欢迎词范文
2015/01/26 职场文书
农民工工资支付承诺书
2015/05/04 职场文书