typora删除图片后清理阿里云图床上的垃圾图片

文章介绍了如何使用阿里云OSSSDK删除Typora因误删而在OSS中残留的图片,包括配置文件中的PREFIXS属性管理和文件夹筛选。作者提供了一个Java示例,展示了如何获取bucket下的文件列表,以及删除指定文件的操作。
摘要由CSDN通过智能技术生成

删除阿里云里面多余的垃圾图片,有些时候typora删除了图片,但是阿里云没有同步删除

注意修改配置文件中的PREFIXS属性,如果图片只存在桶中几个文件夹则需要设置,以逗号分割

        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.10.2</version>
        </dependency>



import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.DeleteObjectsRequest;
import com.aliyun.oss.model.ListObjectsRequest;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;

import java.util.ArrayList;
import java.util.List;

public class OssProperties {

    //填自己的
    public static String EDNPOINT = "oss-cn-hangzhou.aliyuncs.com";
    public static String ACCESS_KEY_ID = "";
    public static String SECRECT = "";
    public static String BUCKET = "";
    public static String PREFIX = "https://xxx.oss-cn-hangzhou.aliyuncs.com/";
    //typora存储在阿里云桶中的文件夹,逗号分割,如果是全桶所有文件夹,设置为空即可
    //public static String PREFIXS = "aa,bb,cc";
    public static String PREFIXS = null;
    public static OSS ossClient;
    //typora的根工作目录,填自己的
    public static String typoraFolder = "C:\\Users\\hello\\Nutstore\\1\\Learn";

    static {
        ossClient = new OSSClientBuilder().build(
                OssProperties.EDNPOINT,
                OssProperties.ACCESS_KEY_ID,
                OssProperties.SECRECT);
    }

    public static void deleteFiles(List<String> ossFiles) {
        List<String> deleteFiles = new ArrayList<>();
        List<String> mdOssFiles = TyporaUselessPictureDelete.mdOssFiles;
        for (String ossFile : ossFiles) {
            if (!mdOssFiles.contains(ossFile)) {
                deleteFiles.add(ossFile);
            }
        }
        if (deleteFiles == null || deleteFiles.size() == 0) {
            return;
        }

        //删除文件时需要去掉前面的桶名和节点,同时去掉最前面的/
        List<String> deleteUrls = new ArrayList<>();
        for (String url : deleteFiles) {
            String fileUrl = url.substring(url.indexOf(OssProperties.EDNPOINT) + OssProperties.EDNPOINT.length() + 1);
            deleteUrls.add(fileUrl);
            System.out.println("oss要删除的文件:"+PREFIX+fileUrl);
        }
        System.out.println("oss要删除的文件总数:"+deleteUrls.size());
        System.out.println("先看清楚是不是自己要删的,然后再取消下面的注释");
        //deleteOssFiles(deleteUrls);
    }

    /**
     * 获取bucket桶下文件夹内的全部文件
     *
     * @return
     */
    public static List<String> getOssBucketFolderFiles(String prefix) {
        ListObjectsRequest listObjectsRequest=new ListObjectsRequest();
        //一次获取文件最多1000个,默认100
        listObjectsRequest.setMaxKeys(1000);
        listObjectsRequest.setBucketName(BUCKET);
        ObjectListing objectListing = ossClient.listObjects(BUCKET, prefix);
        List<String> ossFiles = getOssFiles(objectListing);
        return ossFiles;
    }

    /**
     * 获取bucket桶下的全部文件
     *
     * @return
     */
    public static List<String> getOssBucketFiles() {
        ListObjectsRequest listObjectsRequest=new ListObjectsRequest();
        //一次获取文件最多1000个,默认100
        listObjectsRequest.setMaxKeys(1000);
        listObjectsRequest.setBucketName(BUCKET);
//        ObjectListing objectListing = ossClient.listObjects(BUCKET);
        ObjectListing objectListing = ossClient.listObjects(listObjectsRequest);
        List<String> ossFiles = getOssFiles(objectListing);
        return ossFiles;
    }

    public static List<String> getOssFiles(ObjectListing objectListing) {
        List<OSSObjectSummary> objectSummaries = objectListing.getObjectSummaries();
        List<String> ossFiles = new ArrayList<>();
        for (OSSObjectSummary objectSummary : objectSummaries) {
            ossFiles.add(PREFIX + objectSummary.getKey());
        }
        return ossFiles;
    }

    public static void deleteOssFiles(List<String> deleteKeys) {
        if (deleteKeys != null && deleteKeys.size() > 0) {
            DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(BUCKET);
            deleteObjectsRequest.setKeys(deleteKeys);
            ossClient.deleteObjects(deleteObjectsRequest);
        }
    }

    public static void deleteOssRubbishPicture() {
        List<String> ossFiles = new ArrayList<>();
        if (PREFIXS != null && PREFIXS != "") {
            String[] split = PREFIXS.split(",");
            for (String folder : split) {
                ossFiles.addAll(getOssBucketFolderFiles(folder));
            }
        } else {
            ossFiles = getOssBucketFiles();
        }
        deleteFiles(ossFiles);
    }


}

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TyporaUselessPictureDelete {

    public static int mdFileCount = 0;
    public static List<String> mdOssFiles = new ArrayList<>();


    public static void main(String[] args) {
        start();
    }

    public static void start() {
        File dir = new File(OssProperties.typoraFolder);
        recursivelyMdDirAndFile(dir);
        System.out.println("md文件总数:" + mdFileCount);
        OssProperties.deleteOssRubbishPicture();
    }


    public static void recursivelyMdDirAndFile(File dir) {
        // 获取子文件和目录
        File[] files = dir.listFiles();
        if (files.length <= 0) {
            return;
        }
        //递归遍历子目录,子文件
        /*
        判断:当是文件时,添加到List中,等待遍历
              当是目录时,递归调用此方法,遍历下一级目录
         */
        //需要遍历图片使用的md文件list
        List<File> list = new ArrayList<>();
        for (File file : files) {
            //是文件保存到ArrayList中,等待读取文件
            if (file.getName().toLowerCase().equals("assets")
                    || file.getName().toLowerCase().equals("assests")
                    || file.getName().toLowerCase().endsWith("git")) { //不需要遍历的文件夹
                continue;
            } else if (file.isFile()) {
                if (file.getName().toLowerCase().endsWith(".md")) {
                    list.add(file);
                    readUselessPicture(file);
                    mdFileCount++;
                }
            } else {
                //递归遍历文件夹
                recursivelyMdDirAndFile(file);
            }
        }
    }

    public static void readUselessPicture(File file) {
        InputStreamReader inputStreamReader = null;
        try {
            inputStreamReader = new InputStreamReader(new FileInputStream(file));
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String readEachLine;
            while ((readEachLine = bufferedReader.readLine()) != null) {
                String pathString = patch(file, readEachLine);
                if (pathString!=null && pathString.length() > 0) {
                    mdOssFiles.add(pathString);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static String patch(File file, String input) {
        String regexStart = OssProperties.PREFIX;
        String regexEnd = ".*\\)";
        Pattern p1 = Pattern.compile(regexStart);
        Matcher m1 = p1.matcher(input); // 获取 matcher 对象
        Pattern p2 = Pattern.compile(regexEnd);
        Matcher m2 = p2.matcher(input); // 获取 matcher 对象
        int strStart = 0;
        int strEnd = 0;
        if (m1.find() && m2.find()) {
            strStart = m1.start();
            strEnd = m2.end();
        }
        if (strStart != 0 && strEnd != 0) {
            String strRes = input.substring(strStart, strEnd - 1);
            return strRes;
        }
        return null;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值