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

news2024/11/23 20:19:20

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.coloradmin.cn/o/1034197.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在Idea中调试本地Docker

报错&#xff1a; Error running myApp: Unable to open debugger port (localhost:5005): java.net.SocketException "Connection reset" 原因&#xff1a; Docker配置里边没有配置环境变量JAVA_TOOL_OPTIONS. 解决&#xff1a; 在Docker下加入运行时的环境变量JAVA…

解决0-1背包问题(方案一):二维dp数组

>>确定dp数组以及下标的含义 dp[i][j]表示从下标为[0-i]的物品里任意取&#xff0c;放进容量为j的背包&#xff0c;价值总和最大是多少 &#xff08;1&#xff09;不放物品i 例如&#xff1a;当背包的容量是1kg&#xff0c;此时物品1和物品2都是无法放进去的。而物品0…

【前端】常用属性及实例

1. 盒子水平垂直居中 1&#xff09;flex布局实现水平垂直居中 <style>.box {background: yellow;width: 200px;height: 200px;/* 设置flex布局 */display: flex;/* 水平居中 */justify-content: center;/* 垂直居中 */align-items: center;}.col {margin: 1px;backgroun…

使用 queueMicrotask 创建微任务!

之前我们想尽一切办法来创建一个自定义的微任务&#xff0c;如 Promise.then、MutationObserver&#xff08;浏览器环境中的 API&#xff0c;用于监视 DOM 变动&#xff09;、async/await、process.nextTick&#xff08;仅Node.js支持&#xff0c;本质来说它不是事件循环的一部…

8+单基因+细胞凋亡+WGCNA+单细胞+实验验证

今天给同学们分享一篇单基因细胞凋亡WGCNA实验验证的生信文章“RASGRP2 is a potential immune-related biomarker and regulates mitochondrial-dependent apoptosis in lung adenocarcinoma”&#xff0c;这篇文章于2023年2月3日发表在Front Immunol期刊上&#xff0c;影响因…

JDK21新特性

JDK 21 于 2023 年 9 月 19 日正式发布。Oracle 提供GPL 下的生产就绪二进制文件&#xff1b;其他供应商的二进制文件也将很快推出。 Spring Boot 3.x 版本最低支持的 JDK 版本为 JDK 17&#xff0c;也就是说如果你还想用 JDK8的话&#xff0c;那能用的最高 Spring Boot 版本为…

按文件名称轻松管理文件!让文件管理更加高效!

文件管理是日常工作和生活中必不可少的一环&#xff0c;然而&#xff0c;面对众多的文件&#xff0c;如何快速找到所需文件&#xff0c;是一个具有挑战性的任务。现在&#xff0c;我们为您提供一种智能归类的解决方案&#xff0c;让您能够按文件名称轻松管理文件&#xff0c;让…

基于springboot+vue的高校专业实习管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

如何利用Arcgis进行地统计学分析(二):探索性数据分析

地统计学的相关介绍及概念参考上篇博客&#xff1a; 如何利用Arcgis进行地统计学分析&#xff08;一&#xff09;&#xff1a;地统计学分析概念及其分析流程_小咖~的博客-CSDN博客 探索性数据分析是为了让用户更深入地认识研究对象&#xff0c;从而对与其数据相关的问题做出更…

java:算法题(持续更新)

第一题&#xff1a;特征值计算 案例&#xff1a;定义一个int型的一维数组&#xff0c;包含10个元素&#xff0c;分别赋一些随机整数&#xff0c;然后求出所有元素的最大值&#xff0c;最小值&#xff0c;总和&#xff0c;平均值&#xff0c;并输出出来。要求&#xff1a;所有随…

【刷题篇】回溯算法(深度优先搜索(一))

文章目录 无重复字符串的排列组合员工的重要性图像渲染被围绕的区域 无重复字符串的排列组合 无重复字符串的排列组合。编写一种方法&#xff0c;计算某字符串的所有排列组合&#xff0c;字符串每个字符均不相同。 class Solution { public:void DFS(string &s,vector<s…

手撸列表数据内嵌动态th甘特图

需求如图&#xff1a;日期为后端返回的七天日期&#xff0c;这七天组成由甘特图内嵌展示。 解决思路&#xff1a;这个vue项目中el-table自带样式过多&#xff0c;且不方便动态渲染数据&#xff0c;所以用div模拟了&#xff0c;这里甘特图精度为半天所以用v-if判断了&#xff0…

echarts三柱图叠加三柱图解法

需求如图所示。 解决思路1&#xff1a;实际展示柱体魏三叠加柱的和&#xff0c;那么把每个和计算出来作为一个柱的数组&#xff08;此柱实际展示&#xff09;&#xff0c;为了tootip方便自定义取数据且不用每个都查询原始数据&#xff0c;做叠加柱为一般、严重、危急&#xff…

FastChat 大模型部署推理;Baichuan2-13B-Chat测试、chatglm2-6b测试

参考&#xff1a; https://github.com/lm-sys/FastChat https://blog.csdn.net/qq128252/article/details/132759107 ##安装 pip3 install "fschat[model_worker,webui]"1、chatglm2-6b测试 python3 -m fastchat.serve.cli --model-path ./chatglm2-6b --num-gpus …

【JVM内存区域及创建对象的过程】

文章目录 JVM内存区域及创建对象的过程JVM内存区域JDK1.6、1.7、1.8内存区域的变化&#xff1f;创建对象的过程类的声明周期&#xff1a; JVM内存区域及创建对象的过程 JVM内存区域 JVM 内存区域最粗略的划分可以分为 堆 和栈&#xff0c;当然&#xff0c;按照虚拟机规范&…

Vue页面快速使用阿里巴巴矢量图标库

前面我已经写个一篇文章 阿里巴巴矢量图标如何使用_turbo夏日漱石的博客-CSDN博客 这篇文章非常详细地讲解了在html页面中如何使用阿里巴巴矢量图标库 下面我们讲解在vue页面中引入阿里巴巴矢量图标库icon的几种方法 目录 一、引入在线链接 1、 第九步链接引入在vue中应该是在…

python小程序 图书馆图书借阅借还管理系统 mbc21

为设计一个安全便捷&#xff0c;并且使借阅者更好获取本图书借还信息&#xff0c;本文主要有安全、简洁为理念&#xff0c;实现借阅者快捷寻找图书借还信息&#xff0c;从而解决图书借还信息复杂难辨的问题。该系统以django架构技术为基础&#xff0c;采用python语言和MySQL数据…

科学数据分析和图形绘制软件GraphPad Prism 9 mac中文版特点介绍

Prism 9 mac是一款专业的科学数据分析和图形绘制软件&#xff0c;可用于在生物、医学、化学等领域进行数据分析、绘制图形、进行统计分析等。 Prism 9 mac软件特点 1. 多种数据分析功能&#xff1a;Prism 9提供了多种常见的数据分析工具&#xff0c;包括线性回归、ANOVA、t检验…

如何利用物联网技术打造新型智能餐饮连锁店

中国是美食大国&#xff0c;餐饮美食的消费需求庞大&#xff0c;随着餐饮产业的标准化、规模化发展&#xff0c;餐饮店的连锁化率在持续上升&#xff0c;许多餐饮知名品牌都开设了成百上千家连锁店。随着餐饮连锁店数量的增加&#xff0c;对品牌店铺的管理和运营难度也日益增长…

flowable可使用元素介绍

1. 事件 Events 事件描述图标空启动事件空启动事件未指定触发器&#xff0c;由用户调用的启动事件。定时启动事件定时启动事件在指定时间内创建一次或多次的流程实例。消息启动事件消息启动事件使用具名消息启动流程实例。消息名用于定位指定的启动事件。一个流程定义不得包含…