xx-job凌晨一点清除oss指定文件夹以及指定保留时间的文件

news/2024/6/30 6:20:52 标签: windows, linux, 服务器

ps:文件下面还有文件夹,这代码不能完全保证是否遍历到所有该文件夹以及子文件夹的文件,因为不可能一点点上到服务器去数,只是代码上做到应该不会出现重复的文件夹以及出现死循环

 public static void main(String[] args) {
        long startTime = System.currentTimeMillis();
        System.out.println("CleanOssFileHandler凌晨一点清除的指定文件夹的文件开始执行时间:"+startTime);
        //通过传入一个字符串参数,不同文件夹通过;来分割,每个文件夹的又通过|分割不同的参数,第一个参数是文件夹,第二个参数是保留天数,第三个参数是清除的文件类型
        String params = "exportFile/|7|xls,zip;docfile/|7|xls,zip";
        if (StrKit.isBlank(params)) {
            return;
        }
        String endpoint = getAccessKey().get("endpoint") + "";//"oss-cn-beijing.aliyuncs.com";
        String accessKeyId = getAccessKey().get("ossaccessKeyId") + "";
        String accessKeySecret = getAccessKey().get("ossaccessKeySecret") + "";
        String bucketName = getAccessKey().get("bucketName") + "";
        // 创建 OSS 客户端实例
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        String[] split = params.split(";");
        Set<String> filePath = new HashSet<>();
        Set<String> foldPath = new HashSet<>();
        for (String param : split) {
        String[] split1 = param.split("\\|");
        if (split1.length<3){
            return;
        }
        //保留天数
        int days = Integer.parseInt(split1[1]);
        //保留天数转换成毫米
        long millis = TimeUnit.DAYS.toMillis(days);
        //获取文件类型
        String fileType = split1[2];
        //指定文件目录
        String directory = split1[0];
       deleteflieByFolderPath(directory,bucketName,ossClient,millis,fileType,filePath,foldPath);
       }
        long endTime = System.currentTimeMillis();
        System.out.println("CleanOssFileHandler凌晨一点清除的指定文件夹的文件开始结束时间:" +endTime);
        System.out.println("CleanOssFileHandler凌晨一点清除的指定文件夹的文件本次执行花费时间为:" +(endTime-startTime));
        System.out.println(filePath.size());
        System.out.println(foldPath.size());
         //关闭 OSS 客户端
        ossClient.shutdown();
 }
//获取文件夹下的文件
    public  static void deleteflieByFolderPath(String path,String bucketName,OSS ossClient,long millis,String fileType, Set<String> filePath,Set<String> forlderPath){
         //获取文件夹
        ListObjectsRequest listObjectsRequest1 = new ListObjectsRequest(bucketName);
        listObjectsRequest1.setPrefix(path);
        listObjectsRequest1.setMaxKeys(1000); // 设置每次返回的最大文件数,默认值为1000
        listObjectsRequest1.withDelimiter("/");
        ObjectListing objectListing1 = ossClient.listObjects(listObjectsRequest1);
        //获取文件
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
        listObjectsRequest.setPrefix(path);
        listObjectsRequest.setMaxKeys(1000);
        ObjectListing objectListing = ossClient.listObjects(listObjectsRequest1);
        List<OSSObjectSummary> objectSummaries = objectListing.getObjectSummaries();
        if (CollectionUtil.isNotEmpty(objectSummaries)){
            for (OSSObjectSummary s : objectSummaries) {
                String key = "oss的域名" + s.getKey();
                int length = key.length();
                int i = key.lastIndexOf("/") + 1;
                if (i != length) {
                    File file = new File(key);
                    String fileType1 = file.getName().split("\\.")[1];
                    System.out.println(s.getLastModified());
                    if (DateUtils.getCurrentTime() - s.getLastModified().getTime() > millis&&fileType.contains(fileType1)) {
                        System.out.println(key);
                        //这里为了测试是否有相同的文件
                        if (filePath.contains(key)){
                            System.out.println("重复的文件!!!");
                            return;
                        }
                        filePath.add(key);
                       fileDelete(key);
                    }
            }
          }
        }
        for (String commonPrefix : objectListing1.getCommonPrefixes()) {
            if (commonPrefix.contains("//")){
                continue;
            }
             //这里为了测试是否有相同的文件夹
            if (forlderPath.contains(commonPrefix)){
                return;
            }
            forlderPath.add(commonPrefix);
            deleteflieByFolderPath(commonPrefix,bucketName,ossClient,millis,fileType,filePath,forlderPath);
        }
    }

    private static   Map<String,Object> getAccessKey() {
        Properties properties = new Properties();
        Map<String, Object> data = new HashMap<>();
        try {
            ClassPathResource resource = new ClassPathResource("\\xx.properties");
            properties = PropertiesLoaderUtils.loadProperties(resource);
            if (properties.get("ossaccessKeyId")==null||"".equals(properties.get("ossaccessKeyId"))){
                throw new AposException(9999, "ossaccessKeyId不能为空!");
            }
            if (properties.get("ossaccessKeySecret")==null||"".equals(properties.get("ossaccessKeySecret"))){
                throw new AposException(9999, "ossaccessKeySecret不能为空!");
            }
            if (properties.get("endpoint")==null||"".equals(properties.get("endpoint"))){
                throw new AposException(9999, "endpoint不能为空!");
            }
            if (properties.get("bucketName")==null||"".equals(properties.get("bucketName"))){
                throw new AposException(9999, "bucketName!");
            }
            data.put("endpoint",properties.get("endpoint"));
            data.put("bucketName",properties.get("bucketName"));
            data.put("ossaccessKeyId",properties.get("ossaccessKeyId"));
            data.put("ossaccessKeySecret",properties.get("ossaccessKeySecret"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return data;
    }
    /**
     * 删除指定文件
     * @param
     * @return
     */
    public static  void fileDelete(String ossUrl) {
          String endpoint = getAccessKey().get("endpoint")+"";//"oss-cn-beijing.aliyuncs.com";
          String accessKeyId = getAccessKey().get("ossaccessKeyId")+"";;
          String accessKeySecret =  getAccessKey().get("ossaccessKeySecret")+"";
          String bucketName = getAccessKey().get("bucketName")+"";
        // 填写文件完整路径。文件完整路径中不能包含Bucket名称。
        String objectName = ossUrl;
        //String yuming = http+bucketName+"."+ endpoint+"/";
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        objectName = objectName.replace("域名","");
        try {
            boolean b = ossClient.doesObjectExist(bucketName, objectName);
            // 删除文件或目录。如果要删除目录,目录必须为空。
            if (!b){
                System.out.println("文件已删除");
            }
            ossClient.deleteObject(bucketName, objectName);
        } catch (OSSException oe) {
            throw new ServiceException("文件删除失败:"+oe.getErrorMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

最后本地测试的结果:
在这里插入图片描述
大概两万个文件,需要花费四五分钟。(没包括删除的时间)


http://www.niftyadmin.cn/n/5044258.html

相关文章

计算机竞赛 深度学习YOLO安检管制物品识别与检测 - python opencv

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络4 Yolov55 模型训练6 实现效果7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLO安检管制误判识别与检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&…

解决typescript报错=》不能将类型“undefined”分配给类型“boolean”

报错如下&#xff1a; 然后看看isSearch的类型定义&#xff1a; isSearch的定义是可选属性&#xff0c;但是TypeScript 中将一个参数标记为可选时&#xff0c;它的默认值将是 undefined。可选参数表示你可以选择性地提供该参数&#xff0c;如果不提供&#xff0c;那么它将默认为…

C语言中各种接口标准

1.POSIX&#xff08;Portable Operating System Interface&#xff0c;可移植操作系统接口&#xff09;&#xff1a;是一个定义了操作系统接口标准的家族。它旨在提供一致的API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;和环境&a…

java基础学习之变量与运算符

一&#xff0c;关键字 1&#xff0c;定义&#xff1a;被java语言赋予了特殊含义&#xff0c;用作专门用途的字符串或单词。 2&#xff0c;特点&#xff1a;关键字全都是小写字母。 3&#xff0c;关键字一共50个&#xff0c;其中const和goto是保留字。 4&#xff0c;true&#x…

JavaScript - canvas - 放大镜

效果 示例 项目结构&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>放大镜</title><style type"text/css">div {width: 200px;height: 200px;display: inline-bl…

Activiti7工作流 一【工作流介绍、什么是Activiti7?、Activiti7环境、集成Activiti7、流程引擎API】

文章目录 Activiti7工作流一、工作流介绍1.1 概念1.2 适用行业1.3 应用领域1.4 传统实现方式1.5 什么是工作流引擎 二、什么是Activiti7&#xff1f;2.1 概述2.2 Activiti7内部核心机制2.3 BPMN2.4 Activiti如何使用2.4.1 整合Activiti2.4.2 业务流程建模2.4.3 部署业务流程2.4…

CentOS 7 制作openssl 1.1.1w 版本rpm包 —— 筑梦之路

源码下载地址&#xff1a; https://www.openssl.org/source/openssl-1.1.1w.tar.gz 参考之前的文章&#xff1a; openssl 1.1.1L /1.1.1o/1.1.1t rpm包制作——筑梦之路_openssl的rpm包_筑梦之路的博客-CSDN博客 直接上spec文件&#xff1a; Name: openssl Version: 1.1…

华为云云耀云服务器L实例评测|云耀云服务器L实例部署HertzBeat实时监控系统

华为云云耀云服务器L实例评测&#xff5c;云耀云服务器L实例部署HertzBeat实时监控系统 一、云耀云服务器L实例介绍1.1 云耀云服务器L实例简介1.2 云耀云服务器L实例特点 二、HertzBeat介绍2.1 HertzBeat简介2.2 HertzBeat特点 三、本次实践介绍3.1 本次实践简介3.2 本次环境规…