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 相关文章推荐
用htc组件制作windows选项卡
Jan 13 Javascript
js 操作符实例代码
Oct 24 Javascript
JSQL 基于客户端的成绩统计实现方法
May 05 Javascript
基于Jquery插件开发之图片放大镜效果(仿淘宝)
Nov 19 Javascript
浅析Javascript使用include/require
Nov 13 Javascript
jQuery实现淡入淡出二级下拉导航菜单的方法
Aug 28 Javascript
基于jQuery实现的向下滑动二级菜单效果代码
Aug 31 Javascript
javascript实现抽奖程序的简单实例
Jun 07 Javascript
详解webpack2异步加载套路
Sep 14 Javascript
微信小程序实现日历效果
Dec 28 Javascript
vue中监听返回键问题
Aug 28 Javascript
Ant Design的Table组件去除
Oct 24 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 调用远程url的六种方法小结
2009/11/02 PHP
php利用header函数实现文件下载时直接提示保存
2009/11/12 PHP
PHP中生成UUID自定义函数分享
2015/06/10 PHP
PHP基于openssl实现的非对称加密操作示例
2019/01/11 PHP
Firefox outerHTML实现代码
2009/06/04 Javascript
javascript 四则运算精度修正函数代码
2010/05/31 Javascript
JavaScript下利用fso判断文件是否存在的代码
2010/12/11 Javascript
修复ie8&amp;chrome下window的resize事件多次执行
2011/10/20 Javascript
checkbox使用示例
2013/08/23 Javascript
在JavaScript中重写jQuery对象的方法实例教程
2014/08/25 Javascript
JS+DIV+CSS实现的经典标签切换效果代码
2015/09/14 Javascript
Bootstrap 响应式实用工具实例详解
2017/03/29 Javascript
详解angularJs指令的3种绑定策略
2017/04/13 Javascript
layui前段框架日期控件使用方法详解
2017/05/19 Javascript
Vue 2.0的数据依赖实现原理代码简析
2017/07/10 Javascript
Angular实现模版驱动表单的自定义校验功能(密码确认为例)
2018/05/17 Javascript
layui数据表格实现重载数据表格功能(搜索功能)
2019/07/27 Javascript
vue远程加载sfc组件思路详解
2019/12/25 Javascript
基于javascript实现移动端轮播图效果
2020/12/21 Javascript
跟老齐学Python之从if开始语句的征程
2014/09/14 Python
详解Python3中的Sequence type的使用
2015/08/01 Python
深入解读Python解析XML的几种方式
2016/02/16 Python
python版本的读写锁操作方法
2016/04/25 Python
利用python操作SQLite数据库及文件操作详解
2017/09/22 Python
Python3.5 创建文件的简单实例
2018/04/26 Python
selenium + python 获取table数据的示例讲解
2018/10/13 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
2019/03/05 Python
python调用其他文件函数或类的示例
2019/07/16 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
安装不同版本的tensorflow与models方法实现
2021/02/20 Python
c++工程师面试问题
2013/08/04 面试题
幼儿园招生广告
2014/03/19 职场文书
写给妈妈的感谢信
2015/01/22 职场文书
学校财务管理制度
2015/08/04 职场文书
python前后端自定义分页器
2022/04/13 Python
Python使用pandas导入xlsx格式的excel文件内容操作代码
2022/12/24 Python