Vue+Axios实现文件上传自定义进度条

前文: 之前一直用Elemet-UI的upload组件,但是ui给出的样式Element-UI满足不了,所以决定自己写一个玩玩

总体分三步:

1、页面布局(自定义上传组件样式)
2、Axios上传
3、监听Process 联动页面实现进度条

成果

1、页面布局

<div class="display-upload-wrapper"> 
  <div class="innier-upload-wrapper" :style="innerUploadStyle"> 
     自定义的upload样式 
     <div v-if="fileInfo">{{ fileInfo.name }}.{{ fileInfo.format }} 上传完成</div> 
   </div> 
</div> 
<input id="upload-file" ref="uploadInput" type="file" @change="getFile">

通过input file 上传文件 ,原生的upload input 太丑了,好多人是不是都忘接了什么样子了,我帮大家回忆一下

我们可以通过css隐藏这个文件,让后用js 给其他的dom绑定上这个input的点击事件实现

CSS

.display-upload-wrapper {
  border: 1px solid red;
  width: 384px;
  height: 54px;
  cursor: pointer;
  width: 244px;
  border-radius: 4px;
  background: #F4F8FF;
  .innier-upload-wrapper {
    height: 100%;
    background: linear-gradient(270deg, #C0D8FF 0%, #E7F2FF 100%);
    background-repeat: no-repeat;
    background-size: 10% 100%;
    transition: background-size .3s linear;
  }
}
#upload-file {
  display: none;
}

js

document.querySelector('.display-upload-wrapper').onclick = function() {
  document.querySelector('#upload-file').click()
}

这样点击就可以调起文件选择

2、Axios上传

获取到选中的文件

getFile() {
   const file = this.$refs.uploadInput.files[0]
    if (!file) return
    // 获取到的file用FormData处理成表单键值对
    const formData = new FormData()
    formData.append('file', file)
   //uplaodFileApi是文件上传的api 第一个入参为上传的文件,第二个入参为上传的进度的回调
    uplaodFileApi(formData, this.onProcess).then(res => {
      console.log('uplaodFileApi succ: ', res)
      const { success, msg, data } = res
      if (success) {
        this.fileInfo = data
      }
    })
  },

获取到的file用FormData处理成表单键值对
const formData = new FormData()
formData.append('file', file)Axios的入参为

{
    "method":"POST",
    "url":"/jz/boss/public/upload/b",
    "data":{
 
    },
    "params":{
        "appToken":"xxxxxxxxxxxxxxxxxxxxx ="
    },
    "withCredentials":true,
    "headers":{
        "Content-Type":"multipart/form-data;charset=UTF-8"
    },
    "responseType":""
}

data的值就是传入的fromData,控制台直接打印不出的

要注意的是 headers的Content-Type 要设置成multipart/form-data;charset=UTF-8 "

Content-Type":"multipart/form-data;charset=UTF-8"

做完这些操作我们就可以上传成功了

3、监听Process 联动页面实现进度条

Axios提供了onUploadProgress的回调

所有原生的processs的处理都可以,下面的图就是这个回调的progressEvent

用total 和loaded我们就可以算出进度条的百分比

onProcess(e) {
  const { loaded, total } = e
  const uploadPrecent = ((loaded / total) * 100) | 0
  this.uploadPrecent = uploadPrecent
},

完整代码

<template>
  <div>
    {{ uploadPrecent }}%
    <div class="display-upload-wrapper">
      <div class="innier-upload-wrapper" :style="innerUploadStyle">
        自定义的upload样式
        <div v-if="fileInfo">{{ fileInfo.name }}.{{ fileInfo.format }} 上传完成</div>
      </div>
    </div>
    <input id="upload-file" ref="uploadInput" type="file" @click="clearPreUpload" @change="getFile">
  </div>
</template>
 
<script>
import { uplaodFileApi } from '@/api/uploadApi'
import { UploadStatus } from './format'
export default {
  name: 'Myupload',
 
  data() {
    return {
      uplaodStatus: UploadStatus.wait,
      uploadPrecent: 0,
      timer: undefined,
      fileInfo: undefined
    }
  },
  computed: {
    innerUploadStyle() {
      return `background-size: ${this.uploadPrecent}% 100%;`
    }
  },
  mounted() {
    this.bindUplaodClickToDisplayUplaod()
  },
 
  methods: {
    bindUplaodClickToDisplayUplaod() {
      document.querySelector('.display-upload-wrapper').onclick = function() {
        document.querySelector('#upload-file').click()
      }
    },
    getFile() {
      const file = this.$refs.uploadInput.files[0]
      if (!file) return
      const formData = new FormData()
      formData.append('file', file)
      uplaodFileApi(formData, this.onProcess).then(res => {
        const { success, msg, data } = res
        if (success) {
          this.fileInfo = data
        }
      })
    },
    onProcess(e) {
      const { loaded, total } = e
      const uploadPrecent = ((loaded / total) * 100) | 0
      this.uploadPrecent = uploadPrecent
    },
    clearPreUpload() {
 
    }
  }
}
</script>
 
<style lang="scss" scoped>
  .display-upload-wrapper {
    border: 1px solid red;
    width: 384px;
    height: 54px;
    cursor: pointer;
    width: 244px;
    border-radius: 4px;
    background: #F4F8FF;
    .innier-upload-wrapper {
      height: 100%;
      background: linear-gradient(270deg, #C0D8FF 0%, #E7F2FF 100%);
      background-repeat: no-repeat;
      background-size: 10% 100%;
      transition: background-size .3s linear;
    }
  }
  #upload-file {
    display: none;
  }
</style>

这个请求代码删减过 仅供参考可以理解为 伪代码

const HttpRequest = (type, option) => {
  const options = {
    expirys: true,
    ...option
  }
  return new Promise((resolve, reject) => {
    const queryParams =
      {
          method: type,
          url: options.url,
          data: options.data,
          params: { appToken: requestToken() },
          withCredentials: true,
          headers: options.header ? options.header : DEFAULT_HEADER,
          responseType: options.responseType || ''
        }
    // 如果有onProcess就给axios绑定onUploadProgress回调
    if (options.onProcess) {
      queryParams.onUploadProgress = options.onProcess
    }
    if (options.timeout) {
      queryParams.timeout = options.timeout
    }
    axios(queryParams)
      .then(
        res => {
          const { data = {}, headers = {} } = res || {}
          const result = Object.assign(data, headers)
          resolve(result)
        },
        err => {
          reject(err)
        }
      )
      .catch(error => {
        reject(error)
      })
      .finally(() => {})
  })
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Axios和Jquery实现文件上传功能

    本文实例为大家分享了Axios和Jquery实现文件上传的具体代码,供大家参考,具体内容如下 Jquery上传 jquery文件时,后端好像并没有经过SpringMVC处理,没有被封装成一个MultiPartFIle对象,可通过原生的Servlet API request.getInputStream()获取.至于为什么没被SpringMVC封装成MultipartFile对象目前还没有研究透彻.可能是请求内容类型没有设置成 multipart/form-data.下面是jquery上传文件的代

  • JQuery.uploadify 上传文件插件的使用详解 for ASP.NET

    后来朋友推荐了一个这个叫uploadify的上传插件,似乎挺好,就到官方下了个示例运行,感觉挺好,自己再稍加美化一下就OK 了..! 接下来就讲讲使用过程吧: 1. 下载 官方网站:http://www.uploadify.com/ 直接下载:jquery.uploadify-v2.1.0.rar 我的Demo: MyUpload.rar                官方网站也有demo 下载解压后: 说明:它里面有demo  但是是PHP的,还有一个帮助文档:uploadify v2.1.0

  • jQuery Ajax文件上传(php)

    如何实现jQuery的Ajax文件上传,PHP如实文件上传.AJAX上传文件,PHP上传文件. [PHP文件上传] 在开始之前,我觉得是有必要把通WEB上传文件的原理简单说一下的.实际上,在这里不管是PHP,JSP,还是ASP处理上传的文件,其实都是WEB早已把文件上传到服务器了,我们只是运用上传处理函数来处理上传的文件.而处理函数一般都是用PHP,JSP,ASP等服务端语言来实现的.那么如何通过WEB(HTTP协议来上传文件呢?)你需要类似于以下的HTML代码:test.html 复制代码 代

  • Jquery插件之多图片异步上传

    1.初始化上传控件数量. 复制代码 代码如下: $(document).ready(function() { $('#H_File').uploadFile({ key: 'test',count:3 }); }); 以前的设计思想是,初始化上传控件数量,页面显示为1个上传控件,每当上传成功后,在下面创建一个上传控件. 2.上传图片成功后 这就是最终的效果,如果您有更好的插件,希望一起开源. 其他的就不多说了,如果您感兴趣,点击下载源码 /201010/yuanma/jquery_aspnet_

  • vue中element-ui使用axios上传文件

    本文实例为大家分享了vue中element-ui使用axios上传文件的具体代码,供大家参考,具体内容如下 环境:vue2.5.6+axios0.18.1+element-ui2.15.1 在使用element UI的upload组件上传文件时,遇到一些问题,网上的说法不尽如是,在此记录 其实最主要的估计就是axios相关的问题,因我们平时开发的vue项目都是封装过axios后进行api的调用,但上传操作跟一般的api请求不同,所有总是报错,故需要建立新的axios实例. 文件上传类型可以在el

  • Jquery ajaxsubmit上传图片实现代码

    而且未建立统一上传函数.于是将代码改造了.心想来个ajax异步上传图片吧,这技术应该很老套了.于是直接打开强大的cnblogs轻松的找到了 这篇文章 直接依葫芦画瓢,将该作者的劳动成果直接"拿来主义了".很快就把代码全改造了.可是当我把程序发布到服务器上的时问题来了.上传文件失效了!汗- 都是偷懒造成的恶果.继续打开先前参考的那篇文章.原来作者解释了只能在本地使用而不能发布到服务器上.心想我难道还得用 iframe + http post 这个 郁闷的方式么?? 于是不甘心的我打开了更

  • JQuery上传插件Uploadify使用详解及错误处理

    什么是Uploadify Uploadify是JQuery的一个上传插件,支持多文件上传,实现的效果非常不错,带进度显示. 官网提供的是PHP的DEMO,在这里我详细介绍在Asp.net下的使用. 下载 官方下载 官方文档 官方演示 我们提供的Uploadify下载地址 如何使用 1 创建Web项目,命名为JQueryUploadDemo,从官网上下载最新的版本解压后添加到项目中 2 在项目中添加UploadHandler.ashx文件用来处理文件的上传. 3 在项目中添加UploadFile文

  • elementui+vue+axios实现文件上传本地服务器

    本文实例为大家分享了elementui+vue+axios实现文件上传本地服务器的具体代码,供大家参考,具体内容如下 文件上传的原理 加入文件上传的依赖 <!--文件上传的依赖-->     <dependency>       <groupId>commons-fileupload</groupId>       <artifactId>commons-fileupload</artifactId>       <versio

  • Axios+Spring Boot实现文件上传和下载

    本文实例为大家分享了Axios+Spring Boot实现文件上传和下载的具体代码,供大家参考,具体内容如下 1.所用技术 前端:Vue + Axios 后端:Springboot + SpringMVC 2.单文件上传 后端代码 只需要使用MultipartFile类配合RequestBody注解即可 @PostMapping("your/path") public ResultData courseCoverUpload(@RequestBody MultipartFile fil

  • jQuery Ajax 上传文件处理方式介绍(推荐)

    AJAX 是一种与服务器交换数据的技术,可以在补充在整个页面的情况下更新网页的一部分. 下面的表格列出了所有的 jQuery AJAX 方法: jQuery Ajax在web应用开发中很常用,它主要包括有ajax,get,post,load,getscript等等这几种常用无刷新操作方法,接下来通过本文给大家介绍jquery ajax 上传文件处理方式. FormData对象 XMLHttpRequest Level 2添加了一个新的接口FormData.利用FormData对象,我们可以通过J

随机推荐