minio应用搭建自己的图床工具

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

使用 java 实现的基于 minio 存储引擎的 typora 图片上传插件

上一篇我们介绍了minio的日常运维操作,今天我们基于 miniojava 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

文件->偏好设置 ->图像

image-20210611151558461

mac

image-20210611151443840

设置自定义命令

image-20210611151714663

在命令栏输入 java -jar /{yourDir}/typora-minio-1.0-SNAPSHOT-jar-with-dependencies.jar

点击验证图片上传选项 出现下图说明图片上传成功

企业微信截图_c8ad5e96-2c56-4767-b419-cdb6925d48a3

插入图片可直接自动上传

代码讲解

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的使用就到这里了。

完整代码下载

猜你喜欢

转载自juejin.im/post/7018112112048209956