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代码
Aug 25 Javascript
appendChild() 或 insertBefore()使用与区别介绍
Oct 11 Javascript
使用GruntJS构建Web程序之安装篇
Jun 04 Javascript
详解Jquery Easyui的验证扩展
Jan 09 Javascript
JavaScript 实现 Tab 点击切换实例代码
Mar 25 Javascript
Angular 2父子组件数据传递之@ViewChild获取子组件详解
Jul 04 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
Sep 27 Javascript
JavaScript实现快速排序的方法分析
Jan 10 Javascript
webpack+vue-cli项目中引入外部非模块格式js的方法
Sep 28 Javascript
require.js 加载过程与使用方法介绍
Oct 30 Javascript
vue强制刷新组件的方法示例
Feb 28 Javascript
Vue使用鼠标在Canvas上绘制矩形
Dec 24 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
德生PL330测评
2021/03/02 无线电
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
2018/03/15 PHP
借用Google的Javascript API Loader来加速你的网站
2009/01/28 Javascript
纯js简单日历实现代码
2013/10/05 Javascript
JavaScript函数模式详解
2014/11/07 Javascript
javascript 事件处理示例分享
2014/12/31 Javascript
深入理解JavaScript系列(37):设计模式之享元模式详解
2015/03/04 Javascript
AngularJS学习笔记之依赖注入详解
2016/05/16 Javascript
JavaScript 判断一个对象{}是否为空对象的简单方法
2016/10/09 Javascript
整理一下常见的IE错误
2016/11/18 Javascript
vue.js树形组件之删除双击增加分支实例代码
2017/02/28 Javascript
Vue 过渡实现轮播图效果
2017/03/27 Javascript
Node.js实现mysql连接池使用事务自动回收连接的方法示例
2018/02/03 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
2018/12/24 Javascript
vue中v-show和v-if的异同及v-show用法
2019/06/06 Javascript
vue打包npm run build时候界面报错的解决
2020/08/13 Javascript
vue组件开发之slider组件使用详解
2020/08/21 Javascript
实用的 vue tags 创建缓存导航的过程实现
2020/12/03 Vue.js
深入浅析Python的类
2018/06/22 Python
Python爬虫之pandas基本安装与使用方法示例
2018/08/08 Python
Python数据集切分实例
2018/12/08 Python
Python程序暂停的正常处理方法
2019/11/07 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
2020/02/27 Python
jupyter notebook oepncv 显示一张图像的实现
2020/04/24 Python
matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)
2020/09/25 Python
Python模拟登录requests.Session应用详解
2020/11/17 Python
利用Python实现自动扫雷小脚本
2020/12/17 Python
GUESS盖尔斯法国官网:美国时尚品牌
2016/09/23 全球购物
GetYourGuide台湾:预订旅游活动、景点和旅游项目
2019/06/10 全球购物
KEEN美国官网:美国人气户外休闲鞋品牌
2021/03/09 全球购物
商场活动策划方案
2014/01/24 职场文书
《影子》教学反思
2014/02/21 职场文书
电子商务专业应届生求职信
2014/05/28 职场文书
表扬信格式模板
2015/05/05 职场文书
教师节主题班会教案
2015/08/17 职场文书
pandas:get_dummies()与pd.factorize()的用法及区别说明
2021/05/21 Python