七牛删除视频文件操作

前言:

    现公司采用七牛作为OSS服务器存储视频资源,七牛直播文件上传在七牛中,但是只要是文件都往里面放,在这种情况下,公司决定对七牛视频文件进行整理,节约存储空间资源

思路:

 考虑到上传上七牛的视频文件都是以切片的形式上传,即m3u8+TTS格式文件组合,而数据库中只保存mu38文件的地址,

直接过滤出无用的文件的话只能过滤出m3u8文件,tts文件无法删除,故在官方文档寻找到如下工具

https://developer.qiniu.com/kodo/tools/1302/qshell

所以呢,调用外部命令行工具即可实现

需求:

删除七牛上数据库未保存的用户上传的无用视频文件(但是近十天之内的不删除)

解决方案:

步骤一、提取七牛文件列表,用于筛选无用文件

public static CopyOnWriteArrayList<QiNiuEntity> getQiNiuFiles(String bucket, String prefix ) {
    BucketManager bucketManager = getBucketManager();
    //指定目录分隔符,列出所有公共前缀(模拟列出目录效果)。缺省值为空字符串
    String delimiter = "";  //没有缺省值则不填,列举数据,
    //每次迭代的长度限制,最大1000,推荐值 1000
    int limit = 1000;
    //列举空间文件列表
    BucketManager.FileListIterator fileListIterator = bucketManager.createFileListIterator(bucket, prefix, limit,
            delimiter);
    CopyOnWriteArrayList<QiNiuEntity> files=new CopyOnWriteArrayList<>();
    while (fileListIterator.hasNext()) {
        //处理获取的file list结果
        FileInfo[] items = fileListIterator.next();
        for (FileInfo item : items) {
            QiNiuEntity qiNiuEntity =new QiNiuEntity();
            qiNiuEntity.setKey(item.key);
            String time=   DateUtils.getStringTime(item.putTime);
            qiNiuEntity.setPutTime(time);
          // System.out.println(item.key);
            qiNiuEntity.setMimeType(item.mimeType);
           files.add(qiNiuEntity);
           if(files.size()>998){  //七牛最大1000值失效,只能手动控制下了
               return files;
           }
        }
    }
    return  files;
}

步骤二、提取数据库中的m3u8路径,由于是JSON格式保存在数据库中,所以需要提取

步骤三、比较并过滤出无用的文件

步骤四、调用qshell删除无用文件

public R deleteFiles() {
    //recordings   //kaoji
    CopyOnWriteArrayList<QiNiuEntity> qiNiuFiles = qiNiuFileService.getFile(bucketFile, "recordings");
    //十天之内的文件过滤掉不删除
    String nowTime = DateUtils.formatTime("yyyy-MM-dd HH:mm:ss", System.currentTimeMillis());
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date dateTime1 = null;
    try {
        dateTime1 = sdf.parse(nowTime);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    String[] fileNames = new String[1000]; //最大只能为一千
    for (int i = 0; i < qiNiuFiles.size(); i++) {
        Date dateTime2 = null;
        try {

            dateTime2 = sdf.parse(qiNiuFiles.get(i).getPutTime());
            long difference = dateTime1.getTime() - dateTime2.getTime();
            long days = difference / (1000 * 60 * 60 * 24);
        /*    String fileTime=qiNiuFiles.get(i).getPutTime();
         if(days<10){   //相距十天之内的文件过滤不删除
                System.out.println(qiNiuFiles.get(i).getPutTime());
                System.out.println(qiNiuFiles.get(i).getKey());
            }*/
            if (qiNiuFiles.get(i).getIsOld() == 0 && days > 10) {  //未放入数据库中的文件中中10天之内上传的文件不删除
                fileNames[i] = qiNiuFiles.get(i).getKey();
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        if (i > 998) {
            break;
        }
    }
    List<String> tmp = new ArrayList<String>();
    for (String str : fileNames) {

        if (str != null && str.length() != 0) {
            tmp.add(str);
        }
    }
    fileNames = tmp.toArray(new String[0]);
    Arrays.sort(fileNames);
    //批量删除数据,该方法暂时不用,用来批量删除数据用的
    // qiNiuFileService.deleteFiles(fileNames, bucketFile);
    for (int i = 0; i < fileNames.length; i++) {
        StringBuilder deleteFile =
                new StringBuilder("qshell m3u8delete ").append(bucketFile).append("  ").append(fileNames[i]);
        String deleteFiles = deleteFile.toString();
        String netsString = exec(deleteFiles).toString();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("==========获得值=============");
        logger.info("CMDEXCQINIU..." + netsString + "isGoodInfo");
    }
    return R.ok();
}

//步骤五、在docker中安装qshell,没有使用docker的同学可以直接在服务器上装一个qshell

 

转载请注明出处,掌声送给社会人

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值