一、前言
在我的项目中,很多状况下咱们都会用到文件上传,然而当某个文件太大,或者不小心选错了文件时,咱们就须要终止以后的申请,从新上传文件。同时也能进步网站性能,去除多余申请。
二、代码
当初咱们上传文件,很多都会上传到OSS,当初以阿里云的OSS上传为例(仅为前端代码,Vue实例):
uplodaFile组件封装
<template> <div :class="$style.uploadPack"> <input type="file" @change="$_onUpload" /> <slot /> </div></template><script>import { commonService } from '@/common/service' // 封装的接口申请,依据我的项目状况而定import axios from 'axios'export default { methods: { async $_onUpload(e) { this.$emit('input', { status: 'begin', data: null }) const files = e.target.files let formData = new FormData() const fileName = files[0].name /** getOssToken 返回的数据格式 { expire: 1607499265904 params: { signature: "1", OSSAccessKeyId: "1", key: "1", policy: "1", success_action_status: "200", x-oss-security-token: "1" }, url: "http://xxx.aliyuncs.com" } */ const { data } = await commonService.getOssToken({ filename: fileName }) // 获取阿里云oss返回的数据 Object.keys(data.result.params).forEach(key => { formData.append(key, data.result.params[key]) }) formData.append('file', files[0]) const self = this try { /** * 留神此处接口没有数据返回 只有状态 * 胜利后须要本人依据 getOssToken 接口返回的数据组装返回 */ await axios.post(data.result.url, formData, { cancelToken: new axios.CancelToken(function executor(c) { self.source = c }), }) /** * 通过同步数据给父组件 */ this.$emit('input', { status: 'end', data: { file_name: fileName, url: data.result.url + '/' + data.result.params['key'] } }) /** * 上传胜利后清空表单,防止重名文件不再次执行change事件 */ e.target.value = '' } catch (err) { /** * 是否是手动终止勾销 导致的失败 */ if (axios.isCancel(err)) { this.$message.error(err.message) } else { this.$message.error('上传失败') } this.$emit('input', { status: 'end', data: {} }) e.target.value = '' } }, /** * 终止上传接口申请 */ cancelRequest() { if (typeof this.source === 'function') { this.source('勾销文件上传') } }, },}</script><style lang="scss" module>.uploadPack { position: relative; overflow: hidden; input { position: absolute; z-index: 1; width: 100%; height: 100%; opacity: 0; }}</style>
组件应用
<template> <div> <uploadPack v-model="packInfo" ref="uploadPack"> <a-button :loading="loading" type="primary">上传</a-button> </uploadPack> <a-button @click="cancelRequest"></a-button> </div><template><script>export default { data() { return { loading: false, fileData: {}, } }, watch: { /** * 监听文件上传的数据变动 */ packInfo(newValue) { if (newValue.status === 'begin') { this.loading = true } else if (newValue.status === 'end') { this.loading = false this.fileData = newValue.data } } }, methods: { /** * 终止上传 */ cancelRequest() { this.$refs['uploadPack'] && this.$refs['uploadPack'].cancelRequest() } }}<script>
三、结语
应用场景:
- 页面中新增弹层中有须要上传文件,点敞开弹层按钮时须要终止以后申请。
- 文件上传谬误,须要点击勾销,从新抉择。
- 屡次申请时,终止上一次申请,例如搜寻框,每输出一个字符都要发送一次申请,但输出过快的时候其实后面的申请并没有必要真的发送进来。