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 的方法重载效果
Aug 07 Javascript
Jquery 最近浏览过的商品的功能实现代码
May 14 Javascript
JS使用for循环遍历Table的所有单元格内容
Aug 21 Javascript
Javascript前端UI框架Kit使用指南之Kitjs简介
Nov 28 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
Dec 22 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
May 10 Javascript
jQuery实现响应鼠标事件的图片透明效果【附demo源码下载】
Jun 16 Javascript
Google 爬虫如何抓取 JavaScript 的内容
Apr 07 Javascript
基于angular实现模拟微信小程序swiper组件
Jun 11 Javascript
AngularJs+Bootstrap实现漂亮的计算器
Aug 10 Javascript
JavaScript实现汉字转换为拼音及缩写的方法示例
Mar 28 Javascript
Vue export import 导入导出的多种方式与区别介绍
Feb 12 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蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
解析百度搜索结果link?url=参数分析 (全)
2012/10/09 PHP
php Imagick获取图片RGB颜色值
2014/07/28 PHP
CentOS 安装 PHP5.5+Redis+XDebug+Nginx+MySQL全纪录
2015/03/25 PHP
php采集中国代理服务器网的方法
2015/06/16 PHP
你所要知道JS(DHTML)中的一些技巧
2007/01/09 Javascript
javascript document.execCommand() 常用解析
2009/12/14 Javascript
Jquery 获取checkbox的checked问题
2011/11/16 Javascript
JSONP 跨域共享信息
2012/08/16 Javascript
sencha touch 模仿tabpanel导航栏TabBar的实例代码
2013/10/24 Javascript
javascript Array.prototype.slice的使用示例
2013/11/14 Javascript
介绍一个简单的JavaScript类框架
2015/06/24 Javascript
原生js实现addClass,removeClass,hasClass方法
2016/04/27 Javascript
EasyUI中的dataGrid的行内编辑
2017/06/22 Javascript
利用纯JS实现像素逐渐显示的方法示例
2017/08/14 Javascript
vue2.0的虚拟DOM渲染思路分析
2018/08/09 Javascript
Node.js实现用户评论社区功能(体验前后端开发的乐趣)
2019/05/09 Javascript
jquery+css实现Tab栏切换的代码实例
2019/05/14 jQuery
js实现石头剪刀布游戏
2020/10/11 Javascript
python简单判断序列是否为空的方法
2015/06/30 Python
横向对比分析Python解析XML的四种方式
2016/03/30 Python
Python实现选择排序
2017/06/04 Python
Python 数据可视化pyecharts的使用详解
2019/06/26 Python
Django 项目布局方法(值得推荐)
2020/03/22 Python
pandas中的ExcelWriter和ExcelFile的实现方法
2020/04/24 Python
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
整理HTML5中表单的常用属性及新属性
2016/02/19 HTML / CSS
女性时尚网购:Chic Me
2019/07/30 全球购物
意大利网上书店:LaFeltrinelli
2020/06/12 全球购物
string = null 和string = ''的区别
2013/04/28 面试题
纺织工程专业个人求职信范文
2014/01/27 职场文书
大型营销活动计划书
2014/04/28 职场文书
通信工程求职信
2014/07/16 职场文书
电工生产实习心得体会
2016/01/22 职场文书
2019年家电促销广告语集锦
2019/10/21 职场文书
python3中apply函数和lambda函数的使用详解
2022/02/28 Python