# 问题

在 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.statusready 状态,然后点击删除文件, ready 状态是无法通过 remove 方法调用删除接口的。

解决方法是上传成功时,统一将文件状态改为 success 状态

this.$refs.upload.uploadFiles.forEach(file => {
	file.status = 'success'
})