原因
最近面试面试官说,CSDN若有不少文章或经常上传Githup是一个不错的加分项,不过我比较喜欢使用Typora写在本地,就想着把本地的MD文件上传到CSDN
原理
实际CSDN也是MD,不过本地图片转换比较麻烦,原来想把图片全部上传到阿里云,不过访问量会受限,但CSDN会自动对外链图片转换为内链,于是问题就解决了,可以先把图片上传到阿里云,把本地的MD图片文件地址更改为阿里云的,在复制到CSDN让它自动转换
开干
依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.1.0</version>
</dependency>
代码
public static void main(String[] args) throws IOException {
if(args.length==1){
conversion(args[0],null);
}else if(args.length==2){
conversion(args[0],args[1]);
}else {
System.out.println("用于把Typora文件的链接转换为CSDN链接" +
"\n需要输入文件路径和新文件名" +
"\n新文件名可以省略,若省略直接打印到控制台");
}
}
private static final String ENDPOINT="你的阿里云ENDPOINT";
private static final String ACCESS_KEY_ID ="你的阿里云ACCESS_KEY_ID ";
private static final String SECRET="你的阿里云SECRET";
private static final String BUCKET="你的阿里云BUCKET";
private static final String BASE_PATH="image/";
private static OSS ossClient;
// 使用正则替换图片
private static void conversion(String path,String newName) throws IOException {
Pattern pattern = Pattern.compile("!\\[(.+)]\\((.+)\\)");
Stream<String> lines = Files.lines(Paths.get(path));
ossClient=new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID,SECRET);
StringBuilder builder=new StringBuilder();
lines.forEach(line -> {
Matcher matcher = pattern.matcher(line);
if(matcher.find()){
String name=matcher.group(1);
String url = matcher.group(2);
builder.append("![").append(name).append("](").append(uploadImage(url)).append(")\n");
}else {
builder.append(line).append('\n');
}
});
ossClient.shutdown();
if(newName==null){
System.out.println("----------------------生成内容----------------------");
System.out.println(builder);
}else {
path=path.substring(0,path.lastIndexOf('\\'))+"/"+newName+".md";
Files.write(Paths.get(path),builder.toString().getBytes());
}
}
public static String uploadImage(String filePath){
//调用方法实现上传
File file = new File(filePath);
String fileName=BASE_PATH+file.getName();
ossClient.putObject(BUCKET, fileName,file);
return "https://"+BUCKET+"."+ENDPOINT+"/"+fileName;
}
不过每次都打开IDEA操作太麻烦了,这里main是接收参数的,专门为cmd设计
在pom中加如下面代码打包
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
<configuration>
<archive>
<manifest>
<!--带有包路径的MainClass -->
<mainClass>com.sk.typora.Typora2CSDN</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
打包并把jar包放到JAVA_HOME下就可以在任意CMD使用该命令了
转换后的文件(可见图片已经上传到阿里云了,可以直接复制到CSDN了)
使用其他图床也是类似的,最后不要忘了,定期清理阿里云的图片(当然也可以让图片互相覆盖,这样就不用清理了)