文件上传是最常见的一种业务需要,上传性能可简略,可简单,简略就是把文件传上去就行,简单就是波及大文件断点续传、管制并发等,不晓得大家对上传都理解多少。明天要给大家分享的是上传需要中最为常见的一些场景,话不多说,开干:

拖拽上传

拖拽上传波及到款式交互、文件信息获取,那么,咱们首先理解一下拖拽相干的几个事件:

  1. dragover - 被拖动的对象进入指标容器时触发
  2. dragleave - 被拖动的对象来到指标容器时触发
  3. drop - 被拖动的对象进入指标容器,开释鼠标键时触发

理解了这几个事件,再实现拖拽上传就相当容易了。先上效果图:

成果展现



当被拖动的对象进入指标容器时,容器边框变红。当拖出指标容器,或者开释鼠标键时,容器边框置灰。当开释鼠标键时,获取拖动对象的文件信息。

代码实现

<template>  <div ref="drag" class="drag">    <div class="drag-icon-box">      <!-- 采纳的是 element-ui 的图标 -->      <i class="el-icon-upload"></i>     </div>    <div class="drag-message">      <span class="drag-message-title">将文件拖动到此处,或</span>      <label for="file" class="drag-message-label">        <input          class="drag-message-input"          type="file"          id="file"          name="file"          @change="handleFileChange"        />        <span class="drag-message-manual">点击上传</span>      </label>    </div>  </div></template><script>export default {  data() {    return {      file: null    }  },  async mounted() {    // 给容器绑定相干的拖拽事件    this.bindEvents()  },  methods: {    bindEvents() {      const drag = this.$refs.drag      // 被拖动的对象进入指标容器      drag.addEventListener('dragover', e => {        e.preventDefault()        drag.style.borderColor = 'red'      })      // 被拖动的对象来到指标容器      drag.addEventListener('dragleave', e => {        e.preventDefault()        drag.style.borderColor = '#eee'      })      // 被拖动的对象进入指标容器,开释鼠标键      drag.addEventListener('drop', e => {        e.preventDefault()        drag.style.borderColor = '#eee'        const fileList = e.dataTransfer.files        this.file = fileList[0]        this.uploadFile()      })    },    async uploadFile() {      const form = new FormData()      form.append('name', 'file')      form.append('file', this.file)      const res = await axios.post('/upload', form)    },    handleFileChange(e) {      const file = e.target.files[0]      if (!file) return      this.file = file      this.uploadFile()    }  }}</script><style lang="scss" scoped>.drag {  width: 660px;  height: 300px;  border: 2px dashed;  border-color: #a3a3a3;  border-radius: 5px;  margin: 0 auto;  display: flex;  flex-direction: column;  justify-content: center;  align-items: center;  flex-wrap: wrap;  .drag-icon-box {    width: 100%;    height: 60px;    text-align: center;    font-size: 50px;    line-height: 60px;    color: #606266;  }  .drag-message {    width: 100%;    height: 50px;    line-height: 50px;    text-align: center;    .drag-message-title {      font-size: 14px;      color: #606266;    }    .drag-message-label {      width: 120px;      height: 50px;      height: auto;      position: relative;      overflow: hidden;      .drag-message-input {        position: absolute;        left: -100px;        top: -100px;        z-index: -1;        display: none;      }      .drag-message-manual {        font-size: 14px;        color: #4b87ff;        cursor: pointer;      }    }  }}</style>

上传进度条

进度条能够说是最广泛的一种需要,特地是大文件上传的时候。实现办法也比较简单,利用 axios 的 onUploadProgress 办法就能够了。

成果展现

代码实现

<div>  <!-- 采纳的是 element-ui 的进度条组件 -->  <el-progress    :stroke-width="20"    :text-inside="true"    :percentage="uploadProgress"  ></el-progress></div><script>export default {  data() {    return {      file: null,      uploadProgress: 0    }  },  methods: {    async uploadFile() {      const form = new FormData()      form.append('name', 'file')      form.append('file', this.file)      const res = await axios.post('/uploadfile', form, {        onUploadProgress: progress => {          this.uploadProgress = Number(            ((progress.loaded / progress.total) * 100).toFixed(2)          )        }      })    },    handleFileChange(e) {      const file = e.target.files[0]      if (!file) return      this.file = file      this.uploadFile()    }  }}</script>

勾销上传

当上传很慢等的捉急时,或者手一抖,上传了一个不该上传的视频(你懂的),在上传未实现的状况下,是否进行勾销呢?答案当然是能够的。

成果展现


其实勾销上传就是勾销 ajax 申请,能够利用 axioscancel token 进行勾销。

办法一:应用 CancelToken.source 工厂办法创立 cancel token

const CancelToken = axios.CancelToken;const source = CancelToken.source();axios.post('/upload', form, {  cancelToken: source.token})source.cancel();

办法二:通过传递一个 executor 函数到 CancelToken 的构造函数来创立 cancel token

const CancelToken = axios.CancelToken;let cancel;axios.post('/upload', form, {  cancelToken: new CancelToken(function executor(c) {    cancel = c;  })});cancel();

有趣味的同学能够试一试,将以上办法融入到本人的我的项目中。

总结

ok,以上就是上传需要中最常见的一些场景,无论是拖拽上传还是粘贴上传,最次要的是通过相应的事件拿到文件信息。而进度条和勾销上传则是利用 axiosapi 进行实现,axios 还有泛滥实用的配置选项,大家能够本人钻研一哈。

如果以上内容对你有所帮忙,不要忘了点个赞~

据说喜爱点赞的人运气都不差,置信往年的你肯定逢考必过,逢奖必中