minio应用搭建自己的图床工具
使用 java
实现的基于 minio
存储引擎的 typora
图片上传插件
上一篇我们介绍了minio的日常运维操作,今天我们基于 minio
的 java sdk
徒手撸一个 Typora
上传插件,本文步骤基于前文介绍,不了解的可以点击飞机去查看。
如果你不知道 typora 是什么的话,现在墙裂安利给你,Typora
一款 Markdown
工具。写 Markdown
文件的神器,简洁、方便、免费; 它最大的特点就是:所见即所得,无须分屏预览,或者开启新页面预览。
Why
你百度随便搜下 Typora
会发现大量使用 picgo/picgo-core
的文章,为什么不用他?
配置繁琐
配置繁琐
配置繁琐
炫技
使用说明
安装插件
假设你已经安装好java环境。
下载代码,编译源代码,或者直接使用编译好的jar包,把jar包放到固定目录,在jar包同目录下新建 conf.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的形式进行打包,关键代码如下
依赖配置:
<dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.3.1</version> </dependency> 复制代码
编译配置:
<build> <plugins> <!-- Apache Maven JAR Plugin This plugin provides the capability to build jars. --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <addMavenDescriptor>false</addMavenDescriptor> </archive> </configuration> </plugin> <!-- Apache Maven Assembly Plugin The Assembly Plugin for Maven is primarily intended to allow users to aggregate the project output along with its dependencies, modules, site documentation, and other files into a single distributable archive. --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <addClasspath>false</addClasspath> </manifest> <manifestEntries> <Main-Class>top.javadev.typora.minio.App</Main-Class> <Can-Redefine-Classes>true</Can-Redefine-Classes> <Built-By>javadev.top</Built-By> <Created-By>javadev.top</Created-By> </manifestEntries> </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> 复制代码
关键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的使用就到这里了。
作者:一个程序猿的异常
链接:https://juejin.cn/post/7018112112048209956