# 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 `文件->偏好设置 ->图像` ![image-20210611151558461](https://blog.javadev.top/pic-img/1623395758753.png) #### mac ![image-20210611151443840](https://blog.javadev.top/pic-img/1623395684147.png) #### 设置自定义命令 ![image-20210611151714663](https://blog.javadev.top/pic-img/1623395834780.png) 在命令栏输入 `java -jar /{yourDir}/typora-minio-1.0-SNAPSHOT-jar-with-dependencies.jar` 点击`验证图片上传选项` 出现下图说明图片上传成功 ![企业微信截图_c8ad5e96-2c56-4767-b419-cdb6925d48a3](https://blog.javadev.top/pic-img/%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_c8ad5e96-2c56-4767-b419-cdb6925d48a3.png) ## 代码讲解 ### 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的使用就到这里了。 代码下载