searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Vue Upload上传文件之删除文件:天翼云场景下的深度实践

2026-01-27 08:33:38
0
0

一、核心需求分析

天翼云存储场景下的文件删除需满足以下特性:

  1. 权限控制:仅允许文件所有者或管理员执行删除操作
  2. 数据一致性:确保前端列表与云端存储实时同步
  3. 操作可追溯:记录删除操作日志用于审计
  4. 用户体验优化:提供二次确认、加载状态等交互细节

二、前端实现方案

1. 基础组件配置

html
<el-upload
  action="#"
  :auto-upload="false"
  :file-list="fileList"
  :on-remove="handleRemove"
  :before-remove="beforeRemove"
  list-type="picture-card"
  ref="uploadComponent"
>
  <i class="el-icon-plus"></i>
</el-upload>

关键属性说明:

  • auto-upload="false":禁用自动上传,改由手动触发
  • file-list:双向绑定文件列表数据
  • before-remove:删除前拦截钩子

2. 删除前确认机制

javascript
methods: {
  beforeRemove(file, fileList) {
    return this.$confirm(
      `确定删除文件 ${file.name}?此操作不可恢复`,
      '删除确认',
      {
        confirmButtonText: '确认删除',
        cancelButtonText: '取消',
        type: 'warning'
      }
    )
  },
  
  async handleRemove(file, fileList) {
    try {
      // 显示加载状态
      this.loading = true
      
      // 调用天翼云删除接口
      const res = await deleteFileFromCloud(file.uid)
      
      if (res.code === 200) {
        this.$message.success('删除成功')
        // 更新本地文件列表
        this.fileList = fileList
      } else {
        throw new Error(res.message)
      }
    } catch (error) {
      this.$message.error(`删除失败: ${error.message}`)
      // 回滚文件列表(可选)
      this.fileList = [...this.originalFileList]
    } finally {
      this.loading = false
    }
  }
}

3. 安全增强措施

  • 文件标识处理:使用天翼云返回的fileId而非文件名作为唯一标识
  • 防重复删除:维护originalFileList副本用于异常回滚
  • 操作锁:通过loading状态防止重复提交

三、后端接口设计

1. 接口规范

 
DELETE /api/cloud-files/{fileId}
Headers:
  Authorization: Bearer <token>
  X-Tenant-Id: <tenantId>  // 多租户场景

2. 典型响应结构

json
{
  "code": 200,
  "message": "success",
  "data": {
    "fileId": "123e4567-e89b-12d3-a456-426614174000",
    "deletedAt": "2026-01-23T10:00:00Z"
  }
}

3. 服务端实现要点

java
@DeleteMapping("/{fileId}")
public ResponseEntity<?> deleteFile(
    @PathVariable String fileId,
    @RequestHeader("X-Tenant-Id") String tenantId) {
    
    // 1. 权限校验
    if (!fileService.hasDeletePermission(fileId, tenantId)) {
        return ResponseEntity.status(403).body("无删除权限");
    }
    
    // 2. 执行删除
    try {
        boolean success = cloudStorageClient.deleteFile(fileId);
        if (!success) {
            return ResponseEntity.status(500).body("云端删除失败");
        }
        
        // 3. 记录操作日志
        auditLogService.recordDeleteOperation(fileId, tenantId);
        
        return ResponseEntity.ok().build();
    } catch (Exception e) {
        log.error("删除文件异常", e);
        return ResponseEntity.status(500).body("系统异常");
    }
}

四、异常处理与优化

1. 常见异常场景

场景 前端处理 后端处理
网络中断 重试机制(3次后提示) 返回504状态码
权限不足 显示403错误提示 记录安全审计日志
文件不存在 刷新文件列表 返回404状态码
并发删除 乐观锁机制 检查文件状态版本

2. 性能优化建议

  1. 批量删除接口:对于多文件删除场景,设计批量操作接口
  2. 软删除机制:重要文件先标记为删除状态,定期清理
  3. CDN缓存刷新:删除后触发CDN边缘节点缓存失效

五、完整代码示例

javascript
// 前端组件
export default {
  data() {
    return {
      fileList: [],
      loading: false,
      originalFileList: []
    }
  },
  methods: {
    async initFileList() {
      const res = await fetchFileList()
      this.fileList = res.data.map(item => ({
        name: item.fileName,
        url: item.fileUrl,
        uid: item.fileId,
        status: 'success'
      }))
      this.originalFileList = [...this.fileList]
    },
    
    beforeRemove(file) {
      return this.$confirm(
        `确认删除 ${file.name}`,
        '提示',
        { type: 'warning' }
      )
    },
    
    async handleRemove(file, fileList) {
      try {
        this.loading = true
        const res = await this.$axios.delete(`/api/cloud-files/${file.uid}`)
        
        if (res.data.code === 200) {
          this.$message.success('删除成功')
          this.fileList = fileList
        } else {
          throw new Error(res.data.message)
        }
      } catch (error) {
        this.$message.error(`删除失败: ${error.message}`)
        this.fileList = [...this.originalFileList]
      } finally {
        this.loading = false
      }
    }
  },
  mounted() {
    this.initFileList()
  }
}

结论

通过结合el-upload组件的钩子函数与天翼云存储API,我们构建了完整的文件删除生命周期管理方案。该方案实现了:

  1. 安全可靠的删除流程
  2. 友好的用户交互体验
  3. 完善的错误处理机制
  4. 可扩展的架构设计

在实际项目中,可根据具体业务需求进一步扩展,如添加回收站功能、实现跨租户文件共享删除策略等,构建更完善的云存储管理体系。

0条评论
作者已关闭评论
窝补药上班啊
1387文章数
6粉丝数
窝补药上班啊
1387 文章 | 6 粉丝
原创

Vue Upload上传文件之删除文件:天翼云场景下的深度实践

2026-01-27 08:33:38
0
0

一、核心需求分析

天翼云存储场景下的文件删除需满足以下特性:

  1. 权限控制:仅允许文件所有者或管理员执行删除操作
  2. 数据一致性:确保前端列表与云端存储实时同步
  3. 操作可追溯:记录删除操作日志用于审计
  4. 用户体验优化:提供二次确认、加载状态等交互细节

二、前端实现方案

1. 基础组件配置

html
<el-upload
  action="#"
  :auto-upload="false"
  :file-list="fileList"
  :on-remove="handleRemove"
  :before-remove="beforeRemove"
  list-type="picture-card"
  ref="uploadComponent"
>
  <i class="el-icon-plus"></i>
</el-upload>

关键属性说明:

  • auto-upload="false":禁用自动上传,改由手动触发
  • file-list:双向绑定文件列表数据
  • before-remove:删除前拦截钩子

2. 删除前确认机制

javascript
methods: {
  beforeRemove(file, fileList) {
    return this.$confirm(
      `确定删除文件 ${file.name}?此操作不可恢复`,
      '删除确认',
      {
        confirmButtonText: '确认删除',
        cancelButtonText: '取消',
        type: 'warning'
      }
    )
  },
  
  async handleRemove(file, fileList) {
    try {
      // 显示加载状态
      this.loading = true
      
      // 调用天翼云删除接口
      const res = await deleteFileFromCloud(file.uid)
      
      if (res.code === 200) {
        this.$message.success('删除成功')
        // 更新本地文件列表
        this.fileList = fileList
      } else {
        throw new Error(res.message)
      }
    } catch (error) {
      this.$message.error(`删除失败: ${error.message}`)
      // 回滚文件列表(可选)
      this.fileList = [...this.originalFileList]
    } finally {
      this.loading = false
    }
  }
}

3. 安全增强措施

  • 文件标识处理:使用天翼云返回的fileId而非文件名作为唯一标识
  • 防重复删除:维护originalFileList副本用于异常回滚
  • 操作锁:通过loading状态防止重复提交

三、后端接口设计

1. 接口规范

 
DELETE /api/cloud-files/{fileId}
Headers:
  Authorization: Bearer <token>
  X-Tenant-Id: <tenantId>  // 多租户场景

2. 典型响应结构

json
{
  "code": 200,
  "message": "success",
  "data": {
    "fileId": "123e4567-e89b-12d3-a456-426614174000",
    "deletedAt": "2026-01-23T10:00:00Z"
  }
}

3. 服务端实现要点

java
@DeleteMapping("/{fileId}")
public ResponseEntity<?> deleteFile(
    @PathVariable String fileId,
    @RequestHeader("X-Tenant-Id") String tenantId) {
    
    // 1. 权限校验
    if (!fileService.hasDeletePermission(fileId, tenantId)) {
        return ResponseEntity.status(403).body("无删除权限");
    }
    
    // 2. 执行删除
    try {
        boolean success = cloudStorageClient.deleteFile(fileId);
        if (!success) {
            return ResponseEntity.status(500).body("云端删除失败");
        }
        
        // 3. 记录操作日志
        auditLogService.recordDeleteOperation(fileId, tenantId);
        
        return ResponseEntity.ok().build();
    } catch (Exception e) {
        log.error("删除文件异常", e);
        return ResponseEntity.status(500).body("系统异常");
    }
}

四、异常处理与优化

1. 常见异常场景

场景 前端处理 后端处理
网络中断 重试机制(3次后提示) 返回504状态码
权限不足 显示403错误提示 记录安全审计日志
文件不存在 刷新文件列表 返回404状态码
并发删除 乐观锁机制 检查文件状态版本

2. 性能优化建议

  1. 批量删除接口:对于多文件删除场景,设计批量操作接口
  2. 软删除机制:重要文件先标记为删除状态,定期清理
  3. CDN缓存刷新:删除后触发CDN边缘节点缓存失效

五、完整代码示例

javascript
// 前端组件
export default {
  data() {
    return {
      fileList: [],
      loading: false,
      originalFileList: []
    }
  },
  methods: {
    async initFileList() {
      const res = await fetchFileList()
      this.fileList = res.data.map(item => ({
        name: item.fileName,
        url: item.fileUrl,
        uid: item.fileId,
        status: 'success'
      }))
      this.originalFileList = [...this.fileList]
    },
    
    beforeRemove(file) {
      return this.$confirm(
        `确认删除 ${file.name}`,
        '提示',
        { type: 'warning' }
      )
    },
    
    async handleRemove(file, fileList) {
      try {
        this.loading = true
        const res = await this.$axios.delete(`/api/cloud-files/${file.uid}`)
        
        if (res.data.code === 200) {
          this.$message.success('删除成功')
          this.fileList = fileList
        } else {
          throw new Error(res.data.message)
        }
      } catch (error) {
        this.$message.error(`删除失败: ${error.message}`)
        this.fileList = [...this.originalFileList]
      } finally {
        this.loading = false
      }
    }
  },
  mounted() {
    this.initFileList()
  }
}

结论

通过结合el-upload组件的钩子函数与天翼云存储API,我们构建了完整的文件删除生命周期管理方案。该方案实现了:

  1. 安全可靠的删除流程
  2. 友好的用户交互体验
  3. 完善的错误处理机制
  4. 可扩展的架构设计

在实际项目中,可根据具体业务需求进一步扩展,如添加回收站功能、实现跨租户文件共享删除策略等,构建更完善的云存储管理体系。

文章来自个人专栏
文章 | 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0