学成在线-删除媒资文件


本人技术有限写的不好的地方敬请原谅,如有什么问题或者更好的建议大家可以留言或者私信

前言

教程中我的媒资管理只实现了一个分页查询,这里我们实现删除媒资文件,把上传的文件以及分块的文件都删除以及数据库记录


一、解决思路

修改页面增加一个删除文件的按钮,携带媒资文件的ID发送请求到服务端,使用ID得到文件所在的目录进行删除操作,然后在删除mongodb数据库中的数据即可。
这里要特别注意:但是需要考虑的问题是当课程计划选择了这个视频的时候,删除这个视频是不可以的返回一个不能删除的提示即可

二、修改代码

1.前端

(1)media_list.vue页面增加删除文件按钮

<!--在开始处理按钮后增加一个el-table-column组件-->
<el-table-column label="操作" width="90" v-if="ischoose != true">
  <template slot-scope="scope">
    <el-button
      size="small" type="primary" plain @click="deleteUploadFile(scope.row.fileId)">删除文件
    </el-button>
  </template>
</el-table-column>

(2)media_list.vue删除请求的激发方法

 //删除已经上传的视频文件,如果已经
 deleteUploadFile(mediaId){
    this.$confirm('确认删除所有视频文件吗?', '提示', {}).then(()=>{
      mediaApi.deleteFile(mediaId).then(res=>{
        if(res.success){
          this.$message.success("删除视频文件成功")
        }else{
          this.$message.error(res.message)
        }
      })
    });
  },

(3)media.js发送请求

//删除所有的文件
export const deleteFile=mediaId=>{
  return http.requestDelete(apiUrl+"/media/file/delete/"+mediaId)
}

2.服务端

xc-service-manage-media工程

(1)controller与api

//Api
@ApiOperation("删除文件,分块,ts以及m3u8文件")//Id 媒资文件的ID
public ResponseResult deleteUploadFileChunks(String mediaId);
//controller
//删除文件,分块以及ts,m3u8文件
@Override
@DeleteMapping("/delete/{mediaId}")
public ResponseResult deleteUploadFileChunks(@PathVariable("mediaId") String mediaId){
    return this.mediaFileService.deleteUploadFileChunks(mediaId);
}

(2)递归删除文件的私用方法

private boolean deleteDir(File file) {
      if (!file.exists()) return false;
      if (file.isDirectory()) {
          String[] childrens = file.list();
          // 递归删除目录中的子目录下
          for (String child : childrens) {
              boolean success = deleteDir(new File(file, child));
              if (!success) return false;
          }
      }
      // 目录此时为空,可以删除
      return file.delete();
  }

(3)servicec,处理删除的方法

@Transactional
public ResponseResult deleteUploadFileChunks(String mediaId) {
     //查询mongodb中是否包含这调数据
     Optional<MediaFile> optionalById = this.mediaFileRepository.findById(mediaId);
     if (!optionalById.isPresent()){
         //为空抛出异常
         log.error("删除文件失败,数据库不包含词条记录;mediaId:"+mediaId);
         ExceptionCast.cast(MediaCode.MERGE_FILE_DELETE_FAIL);
         return new ResponseResult(CommonCode.FAIL);
     }
     //获取到文件信息对象
     MediaFile mediaFile = optionalById.get();
     //获取上传文件路径(路径格式E:\xcEdu\xcVideo\0\1\013b627312c228c7d1a068b58844cdb4)删除以文件ID命名的文件夹及其所有的子文件
     String deleteFilePath=this.upload_location+mediaId.substring(0,1)+"/"+mediaId.substring(1,2)+"/"+mediaId;
     File file=new File(deleteFilePath);
     boolean result = this.deleteDir(file);
     if (!result){
         //删除出错
         log.error("删除文件失败目录不存在;deleteFilePath:"+deleteFilePath);
         ExceptionCast.cast(MediaCode.MERGE_FILE_DELETE_FAIL);
         return new ResponseResult(CommonCode.FAIL);
     }
     //删除数据库记录
     this.mediaFileRepository.deleteById(mediaId);
     return new ResponseResult(CommonCode.SUCCESS);
 }

(4)MediaCode增加一个错误异常枚举

MERGE_FILE_DELETE_FAIL(false,22020,"删除文件失败!");

3.测试

在这里插入图片描述

4.bug出现解决

使用代码测试通过之后,我上传同一个文件然后再次删除系统就会抛出异常不可以删除文件,具体原因查询之后说是由于操作文件需要流有的没有关闭导致进程占用文件无法删除。我重启服务之后就可以删除。
解决方法: https://blog.csdn.net/weixin_45305953/article/details/108810425

本人技术有限如有任何问题,或者更好的解决方法直接评论私聊我即可

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页