# 问题
在 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' | |
| }) | 
