删除阿里云里面多余的垃圾图片,有些时候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;
}
}