# typora-minio
**Repository Path**: tankdev/typora-minio
## Basic Information
- **Project Name**: typora-minio
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-10-12
- **Last Updated**: 2022-01-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Typora-minio-plugin
使用 `java` 实现的基于 `minio` 存储引擎的 `typora` 图片上传插件
[上一篇我们介绍了minio的日常运维操作](https://juejin.cn/post/7016888512163086350),今天我们基于 `minio` 的 `java sdk` 徒手撸一个 `Typora`
上传插件,本文步骤基于前文介绍,不了解的可以点击[飞机去查看](https://juejin.cn/post/7016888512163086350)。
如果你不知道 [typora](https://www.typora.io/)
是什么的话,现在墙裂安利给你,`Typora` 一款 `Markdown` 工具。写 `Markdown` 文件的神器,简洁、方便、免费;
它最大的特点就是:**所见即所得**,无须分屏预览,或者开启新页面预览。
## Why
你百度随便搜下 `Typora` 会发现大量使用 `picgo/picgo-core` 的文章,为什么不用他?
- 配置繁琐
- 配置繁琐
- 配置繁琐
- 炫技
## 使用说明
### 安装插件
假设你已经安装好java环境。
下载代码,编译源代码,或者直接使用编译好的jar包,把jar包放到固定目录,在jar包同目录下新建 `conf.properties` 文件。内容如下
```properties
# 上传的域名
host=http://127.0.0.1:9000
# MINIO_ACCESS_KEY
accessKey=ProEXEC
# MINIO_SECRET_KEY
secretKey=ONRPROEXEC
# 存储文件的bucket,不存在会自动创建
bucketName=testbucket
# 文件前缀,用于区分文件,可以不配
customKey=javadev
```
### 插件配置
#### windows
`文件->偏好设置 ->图像`

#### mac

#### 设置自定义命令

在命令栏输入 `java -jar /{yourDir}/typora-minio-1.0-SNAPSHOT-jar-with-dependencies.jar`
点击`验证图片上传选项` 出现下图说明图片上传成功

## 代码讲解
### POM依赖
为了方便运行我们使用了fatjar的形式进行打包,关键代码如下
依赖配置:
```xml
io.minio
minio
8.3.1
```
编译配置:
```xml
org.apache.maven.plugins
maven-jar-plugin
3.2.0
false
org.apache.maven.plugins
maven-assembly-plugin
3.3.0
false
top.javadev.typora.minio.App
true
javadev.top
javadev.top
jar-with-dependencies
make-assembly
package
single
```
### 关键java代码
```java
package top.javadev.typora.minio;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.UploadObjectArgs;
import io.minio.errors.MinioException;
import top.javadev.typora.minio.config.UploadConfig;
import top.javadev.typora.minio.util.Utils;
/**
* @author javadev.top
* @date 2021/10/11
*/
public class App {
public static void main(String[] args) {
if (args.length > 0) {
App app = new App();
UploadConfig config = Utils.loadConfig();
for (String path : args) {
String url = app.upload(path, config);
// Typora 会提取脚本的输出作为地址,将markdown上图片链接替换掉
System.out.println(config.getHost() + "/" + config.getBucketName() + "/" + url);
}
} else {
}
}
/**
* 上传
*
* @param path
* 文件路径
* @param config
* 配置信息
* @return {@link String}
*/
public String upload(String path, UploadConfig config) {
StringBuilder url = new StringBuilder();
try {
MinioClient minioClient = MinioClient.builder().endpoint(config.getHost())
.credentials(config.getAccessKey(), config.getSecretKey()).build();
boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(config.getBucketName()).build());
if (!found) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(config.getBucketName()).build());
}
if (config.getCustomKey() != null && config.getCustomKey().trim().length() > 0) {
url.append(config.getCustomKey()).append("/");
}
url.append(System.nanoTime());
url.append(Utils.getSuffix(path));
minioClient.uploadObject(UploadObjectArgs.builder().bucket(config.getBucketName()).object(url.toString())
.filename(path).build());
} catch (MinioException e) {
System.out.println("Error occurred: " + e);
System.out.println("HTTP trace: " + e.httpTrace());
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
}
return url.toString();
}
}
```
关于minio的使用就到这里了。
代码下载