element 实现文件上传:只能上传一个,且能覆盖上传 & 文件大小,类型限制
element
A Vue.js 2.0 UI Toolkit for Web
项目地址:https://gitcode.com/gh_mirrors/eleme/element
免费下载资源
·
需求:
在文件满足条件时直接上传,再次上传时若文件满足条件则覆盖之前的文件上传,否则则提示且不上传不满足条件的文件。
<!-- :limit="1" --> // 注意:最大允许上传个数:这里不要置为1,置为1有个问题就是:无论怎么选择文件,页面上展示的始终是第一次选择的文件,这效果和我想的大相径庭。
<el-upload
ref="upload"
class="uploadBox"
:action="$config.baseURL + '/resource/upload/images'"
:http-request="handleFileUpload"
:on-change="handleChange"
:auto-upload="false" // 注意1
:before-upload="beforeFileUpload" // 注意2:
:file-list="fileList" // 上传的文件列表
:show-file-list="isShowList" // 是否显示已上传文件列表
:on-remove="handleFileRemove"
>
<el-button type="primary" size="small" >上传文件</el-button>
<div slot="tip" class="el-upload__tip">注:仅支持zip格式压缩文件</div>
</el-upload>
:auto-upload:// 是否在选取文件后立即进行上传
:on-change:// 文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用
:before-upload: // 上传文件之前的钩子,参数为上传的文件,若返回 false 或者返回 Promise 且被 reject,则停止上传。
:http-request: // 覆盖默认的上传行为,可以自定义上传的实现
:on-remove: // 文件列表移除文件时的钩子
data() {
return {
isShowList:false,
fileList:[ ]
}
}
methods方法
// 点击上传文件的按钮:
handleChange(file, fileList) {
// 限制大小在10MB之内
let isLt10M = file.size / 1024 / 1024 < 10
if(!isLt10M) {
this.$message.error("上传文件大小不能超过 10MB!")
}
// 限制类型只能为zip
let isResPackage = file.raw.type.includes('zip') // 是否为zip格式
if(!isResPackage){
this.$message.error("请上传正确格式的文件!")
}
// 只有两个条件都满足的时候,根据文件数量判断
if(isResPackage && isLt10M) {
// 若文件>1个,则取第二个文件上传
if(fileList.length > 1) {
this.fileList = [fileList[fileList.length - 1]]
this.$nextTick(()=>{
// 主动去调用提交接口
this.$refs.upload.submit();
})
// 若文件只有一个,直接上传
} else {
this.$refs.upload.submit();
}
// 若任意不满足一个条件,则不进行上传动作,根据数量判断
} else {
// 若文件>1,则保留第一个上传的文件
if(fileList.length > 1) {
this.fileList = [fileList[0]]
// 当只有当前这一个文件时,则清空文件列表
} else {
this.fileList = []
// this.$refs.upload.clearFiles() // 清除前端显示的文件列表
}
}
},
//文件上传条件
beforeFileUpload(file) {
console.log(file,'file的信息')
//注意:当有如题的需求时,可把这里的限制逻辑移至:on-change钩子中
// let isResPackage = file.type.includes('zip') // 是否为zip格式
// let isLt10M = file.size / 1024 / 1024 < 10
// if(!isResPackage){
// this.$message.error("请上传正确格式的文件!")
// }
// if(!isLt10M) {
// this.$message.error("上传文件大小不能超过 10MB!")
// }
// return isResPackage && isLt10M;
},
// 自定义文件上传
handleFileUpload(e) {
console.log(e.file);
this.isShowList = true;
const that = this;
this.ossUpload(e.file, {
progress: (p, checkpoint) => {
//因为是el-upload组件自定义上传,若需要显示进度条,必须手动调用进度条方法
that.progress = p;
e.onProgress({ percent: Math.floor(p * 100) }); // 触发el-upload组件的onProgress方法
}
})
.then(result => {
console.log(result);
let index = result.res.requestUrls[0].indexOf("?");
if (index != -1)
that.advSubmitData.extFile = result.res.requestUrls[0].substring(0, index);
else that.advSubmitData.extFile = result.res.requestUrls[0];
that.$message.success("文件上传成功");
})
.catch(e => {
that.$message.error("文件上传失败");
});
},
//移除上传文件
handleFileRemove(file, fileList) {
console.log(file,fileList);
this.advSubmitData.extFile = "";
},
页面显示上面:用户选择第二个文件后,从第一个文件到第二个文件,有很明显的动态切换的效果,如果不想要,可以通过下面的css代码去覆盖:
<style lang="scss" scoped>
.upload-demo {
display: flex;
}
/deep/ .el-list-enter-active,
/deep/ .el-list-leave-active {
transition: none;
}
/deep/ .el-list-enter,
/deep/ .el-list-leave-active {
opacity: 0;
}
/deep/ .el-upload-list {
height: 40px;
}
</style>
注意,VUE3.0下/deep/的使用可能会有报错,比如我的项目就报错了:
这时可以把/deep/替换为::v-deep
GitHub 加速计划 / eleme / element
54.06 K
14.63 K
下载
A Vue.js 2.0 UI Toolkit for Web
最近提交(Master分支:3 个月前 )
c345bb45
7 个月前
a07f3a59
* Update transition.md
* Update table.md
* Update transition.md
* Update table.md
* Update transition.md
* Update table.md
* Update table.md
* Update transition.md
* Update popover.md 7 个月前
更多推荐
已为社区贡献2条内容
所有评论(0)