# 问题
在 el-upload 上传重复文件时,通过 before-upload 方法过滤后,return false 时,会触发 remove 事件。然而,我们的 remove 方法中存在删除接口,会把原来的重名文件通过接口删除,刷新后界面后,会发现原来的文件丢失。
代码如下:
<el-upload | |
v-show="!row.rowspan" | |
ref="upload" | |
multiple | |
:show-file-list="true" | |
action="#" | |
:on-change="onChange" | |
:http-request="httpRequest" | |
:file-list="row.fileList" | |
:on-preview="onPreview" | |
:on-remove="onRemove" | |
:on-success="onUploadSuccess" | |
:on-error="onUploadError" | |
:before-upload="beforeUpload" | |
:disabled="rowDisable(row)" | |
> | |
<el-button type="text" :disabled="rowDisable(row)">上传</el-button> | |
<div v-if="row.nodeNum === 0" slot="tip" class="el-upload__tip upd--tip"> | |
<i v-show="updTip" class="el-icon-info" /><!--swig0--> | |
</div> | |
</el-upload> | |
<script> | |
export default { | |
methods: { | |
beforeUpload(file, fileList) { | |
if (file.size / 1024 / 1024 > 50) { | |
this.$message.info('不能上传超过50M的文件') | |
return false | |
} | |
const { name } = file | |
if (Array.isArray(this.updFileList)) { | |
const alreadySameName = this.updFileList.some(item => item.name === name) | |
if (alreadySameName) { | |
this.$message.warning('上传文件名称重复') | |
return false | |
} | |
} | |
}, | |
// 删除 | |
onRemove(file) { | |
let params = {} | |
const { id, url } = file | |
if (id && url) { | |
params = { | |
id, | |
url | |
} | |
} else { | |
const result = this.updFileList.filter(item => item.name === file.name) | |
if (Array.isArray(result) && result.length > 0) { | |
params = { | |
id: result[0].id, | |
url: result[0].url | |
} | |
} | |
} | |
api.deleteFile(params).then(res => { | |
if (res.code == 200) { | |
this.updFileList = this.updFileList.filter(item => params.id !== item.id) | |
} | |
}) | |
}, | |
} | |
} | |
</script> |
# 解决办法
# 1. 删除前,加上状态校验
if (file && file.status === 'success') |
完整代码如下:
// 删除 | |
onRemove(file) { | |
/** 加上状态验证 */ | |
if (file && file.status === 'success') { | |
let params = {} | |
const { id, url } = file | |
if (id && url) { | |
params = { | |
id, | |
url | |
} | |
} else { | |
const result = this.updFileList.filter(item => item.name === file.name) | |
if (Array.isArray(result) && result.length > 0) { | |
params = { | |
id: result[0].id, | |
url: result[0].url | |
} | |
} | |
} | |
api.deleteFile(params).then(res => { | |
if (res.code == 200) { | |
this.updFileList = this.updFileList.filter(item => params.id !== item.id) | |
} | |
}) | |
} | |
}, |
# 2. 及时更新文件状态
上述方法虽然可以解决重复文件上传防误删问题,但是对于刚刚上传的文件, file.status
为 ready
状态,然后点击删除文件, ready
状态是无法通过 remove 方法调用删除接口的。
解决方法是上传成功时,统一将文件状态改为 success
状态
this.$refs.upload.uploadFiles.forEach(file => { | |
file.status = 'success' | |
}) |