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

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

java 复制代码
 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);
 
        List<OSSObjectSummary> objectSummaries = objectListing1.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();
            }
        }
    }

最后本地测试的结果:

大概两万个文件,需要花费四五分钟。(没包括删除的时间)

相关推荐
誰能久伴不乏几秒前
从底层看透音视频架构:FFmpeg 实时视频推流深度解析
linux·c++·tcp/ip·ffmpeg
浪客灿心1 分钟前
Linux数据链路层
linux·网络
落羽的落羽5 分钟前
【算法札记】练习 | Week3
linux·服务器·数据结构·c++·人工智能·算法·动态规划
wanhengidc9 分钟前
服务器机柜的功能是什么
运维·服务器·网络
小明同学0110 分钟前
计算机网络编程———手写 TCP 服务器(一)搞懂网络编程核心 API
服务器·网络·计算机网络
keyipatience13 分钟前
Linux进程调度与优先级机制解析
linux·运维·服务器
IT大白鼠25 分钟前
Linux系统中应用程序安装及管理
linux·服务器
叶非花29 分钟前
Ubuntu服务器性能检测工具NetData安装
linux·服务器·ubuntu
开开心心就好31 分钟前
免费开源的网课教学屏幕画板工具
windows·eureka·计算机外设·word·excel·etcd·csdn开发云
在角落发呆31 分钟前
Windows 8系统下的IP转发:一台电脑如何变身网络桥梁
运维·服务器