Typora+MinIO+Java程式碼打造舒適寫作環境

語言: CN / TW / HK

作者:IT王小二

部落格:http://itwxe.com

前面小二介紹過使用Typora+PicGo+LskyPro打造舒適寫作環境,那時候需要使用水印功能,但是小二在升級LskyPro2.x版本發現有很多不如人意的東西,遂棄用LskyPro使用MinIO結合程式碼實現自己需要的圖床功能,也適合以後擴充套件功能。

安裝MinIO

安裝參考MinIO官網,或者參考小二的部落格,搜尋關鍵詞 → Linux安裝MinIO

安裝完成之後使用域名對映好後臺服務,小二使用nginx配置域名,配置參考如下。

```nginx server { listen 443 ssl; server_name minio.itwxe.com; include /usr/local/nginx/conf/conf.d/common.conf; access_log logs/minioAccess.log;

    location / {
        proxy_pass http://127.0.0.1:9000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

server {
    listen 443 ssl;
    server_name minio-console.itwxe.com;
    include /usr/local/nginx/conf/conf.d/common.conf;
    access_log logs/minioAccess.log;

    location / {
        proxy_pass http://127.0.0.1:9020;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

```

其中common.conf為域名通用配置。

nginx ssl_certificate /usr/local/nginx/ssl/fullchain.crt; ssl_certificate_key /usr/local/nginx/ssl/itwxe.com.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 30m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5:!EXPORT56:!EXP; ssl_prefer_server_ciphers on; proxy_connect_timeout 500; proxy_send_timeout 500; proxy_read_timeout 500; client_max_body_size 100m;

配置好之後訪問http://minio-console.itwxe.com即可訪問後臺。

同時為了儲存桶圖片所有人可以訪問,需要將儲存桶設定為公開。

設定儲存桶為public

Java程式碼上傳圖片

Java程式碼為個人定製使用,僅供參考,整體專案目錄結構。

專案目錄結構

使用maven搭建Java專案,引入依賴,pom.xml如下。

```xml

4.0.0

<groupId>com.itwxe</groupId>
<artifactId>minio-typora</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
</properties>

<dependencies>
    <!-- minio -->
    <dependency>
        <groupId>io.minio</groupId>
        <artifactId>minio</artifactId>
        <version>8.4.4</version>
    </dependency>
</dependencies>


<build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

```

增加配置類MinioConfig。

```java package com.itwxe.config;

/ * @author itwxe * @since 2022/9/29 / public class MinioConfig {

/**
 * 請求地址,需修改成自己的服務地址
 */
public static final String ENDPOINT = "http://minio.itwxe.com";
/**
 * 使用者名稱,需修改為自己的使用者名稱
 */
public static final String ACCESS_KEY = "admin";
/**
 * 祕鑰,需修改為自己的密碼
 */
public static final String SECRET_KEY = "12345678";
/**
 * 儲存桶名稱
 */
public static final String BUCKET = "img";

} ```

增加主類進行圖片上傳。

```java package com.itwxe;

import com.itwxe.config.MinioConfig; import io.minio.MinioClient; import io.minio.UploadObjectArgs;

import java.time.LocalDateTime; import java.time.ZoneOffset;

/ * @author itwxe * @since 2022/9/29 / public class MinioTyporaApplication {

/**
 * 部落格圖片子路徑
 */
private static final String IMG_DIR = "blog";

public static void main(String[] args) {
    try {
        // 使用MinIO伺服器平臺、其訪問金鑰和金鑰建立minioClient。
        MinioClient minioClient = MinioClient.builder()
                .endpoint(MinioConfig.ENDPOINT)
                .credentials(MinioConfig.ACCESS_KEY, MinioConfig.SECRET_KEY)
                .build();
        // 部落格文章唯一連結id
        String blogPermalink = args[0];
        if (blogPermalink.length() > 8) {
            System.out.println("文章唯一id未設定!");
            return;
        }
        // 迴圈上傳圖片
        for (int i = 1; i < args.length; i++) {
            String arg = args[i];
            // 生成自定義檔名, 規則為部落格唯一連結id_時間戳+隨機2位數
            String fileSuffix = arg.substring(arg.lastIndexOf("."));
            String fileName = String.format("%s_%s%02d%s", blogPermalink, LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli(), (int) (Math.random() * 100), fileSuffix);
            // 上傳圖片
            minioClient.uploadObject(UploadObjectArgs.builder()
                    .bucket(MinioConfig.BUCKET)
                    .object(String.format("/%s/%s", IMG_DIR, fileName))
                    .filename(arg)
                    .build());
            // 打印出來的字元會返回給typora
            System.out.println(String.format("%s/%s/%s/%s", MinioConfig.ENDPOINT, MinioConfig.BUCKET, IMG_DIR, fileName));
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        System.exit(0);
    }
}

} ```

typora測試上傳圖片

為方便使用,使用mvn clean package打包成jar包,開啟typora,偏好設定 -> 影象設定。

typora偏好設定

java java -jar /Users/itwxe/minio-typora.jar fd52d52a

其中 /Users/itwxe/minio-typora.jar 為jar包路徑,fd52d52a為小二個人定製的文章唯一id。

點選驗證圖片上傳選項,正常返回測試路徑,同時圖片瀏覽器可以訪問則代表成功。