springboot2.2.X手冊:放棄fastdfs,整合Minio做文件服務器真香

溪雲閣:專注編程教學,架構,JAVA,Python,微服務,機器學習等,歡迎關注獲取源碼,篇幅較長,建議先收藏。


目錄

什麼是Minio

爲什麼選擇Minio

整合Minio

屬性類

配置類

配置文件

接口類

測試


上一篇:springboot2.2.X手冊:防抓包?快速實現API接口數據加密

springboot2.2.X手冊:放棄fastdfs,整合Minio做文件服務器真香

 

什麼是Minio

Minio是Apcche旗下的一款開源的輕量級文件服務器,基於對象存儲,協議是基於Apache License v2.0,開源可用於商務。

Minio主要用來存儲非結構化的數據,類似文件,圖片,照片,日誌文件,各類備份文件等,按照官網描述,文件的大小從幾KB到5TB。

Minio提供了非常方便,友好的界面,並且文檔也是非常豐富,具體可以參考它的docs

htt ps://docs.min.io/cn/minio-quickstart-guide.html

爲什麼選擇Minio


以前小編使用阿里的OSS,但是是真的貴,後來使用FastDFS,在友好度上,並不友善,不過這一塊仁者見仁智者見智,不做參考,各位看官按照自己喜歡的就行。

Minio是支持docker安裝的,非常方便,小編現在的私人服務器上,就是用的docker安裝方式,支持多租戶,高可用用集羣多節點來做,這個上面的網址都有詳細說明,文檔還是非常豐富的。

整合Minio

<?xml version="1.0"?>
<project
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
	xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.boots</groupId>
		<artifactId>boots</artifactId>
		<version>1.1.0.RELEASE</version>
	</parent>
	<artifactId>boots-module-minio</artifactId>
	<name>boots-module-minio</name>
	<url>http://maven.apache.org</url>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
	<dependencies>

		<!--minio文件系統 -->
		<dependency>
			<groupId>io.minio</groupId>
			<artifactId>minio</artifactId>
			<version>7.0.2</version>
		</dependency>

		<!-- 統一異常包 -->
		<dependency>
			<groupId>com.boots</groupId>
			<artifactId>module-boots-exception</artifactId>
			<version>2.0.0.RELEASE</version>
		</dependency>

	</dependencies>
</project>

屬性類

/**
 * All rights Reserved, Designed By 溪雲閣
 * Copyright:    Copyright(C) 2016-2020
 */

package com.boots.module.minio;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import lombok.Data;

/**
 * minio屬性文件
 * @author:溪雲閣
 * @date:2020年6月7日
 */
@Data
@Configuration
@ConfigurationProperties(prefix = "boots.module.minio")
public class MinioData {

    /**
     * minio地址+端口號
     */
    private String url;

    /**
     * minio用戶名
     */
    private String accessKey;

    /**
     * minio密碼
     */
    private String secretKey;

    /**
     * 文件桶的名稱
     */
    private String bucketName;

}

配置類

在這個配置類裏面,是可以拓展的minioClient的,編寫自己喜歡的方法,小編這裏爲了演示方便,就直接採用原來,其實都是一樣的,只不過有些人喜歡按照自己的風格重寫一遍而已。

/**
 * All rights Reserved, Designed By 溪雲閣
 * Copyright:    Copyright(C) 2016-2020
 */

package com.boots.module.minio;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.module.boots.exception.CommonRuntimeException;

import io.minio.MinioClient;
import lombok.extern.slf4j.Slf4j;

/**
 * minio客戶端配置
 * @author:溪雲閣
 * @date:2020年6月7日
 */
@Slf4j
@Configuration
public class MinioConfig {

    @Autowired
    private MinioData minioData;

    /**
     * 初始化minio客戶端,不用每次都初始化
     * @author 溪雲閣
     * @return MinioClient
     */
    @Bean
    public MinioClient minioClient() {
        try {
            return new MinioClient(minioData.getUrl(), minioData.getAccessKey(), minioData.getSecretKey());
        }
        catch (final Exception e) {
            log.error("初始化minio出現異常:{}", e.fillInStackTrace());
            throw new CommonRuntimeException(e.fillInStackTrace());
        }
    }

}

配置文件

######配置基本信息######
##配置應用名稱
spring.application.name: boots-minio
##配置時間格式,爲了避免精度丟失,全部換成字符串
spring.jackson.timeZone: GMT+8
spring.jackson.dateFormat: yyyy-MM-dd HH:mm:ss
spring.jackson.generator.writeNumbersAsStrings: true
# 上傳文件總的最大值
spring.servlet.multipart.max-request-size: 10MB
# 單個文件的最大值
spring.servlet.multipart.max-file-size: 10MB
## minio文件系統
boots.module.minio.url: http://127.0.0.1:9000
boots.module.minio.accessKey: minio
boots.module.minio.secretKey: 123456
boots.module.minio.bucketName: boots

接口類

/**
 * All rights Reserved, Designed By 溪雲閣
 * Copyright:    Copyright(C) 2016-2020
 */

package com.boots.minio.view.minio.view;

import java.io.InputStream;
import java.net.URLEncoder;

import javax.servlet.http.HttpServletResponse;

import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.boots.module.minio.MinioData;
import com.module.boots.api.message.ResponseMsg;
import com.module.boots.api.utils.MsgUtils;
import com.module.boots.exception.CommonRuntimeException;

import io.minio.MinioClient;
import io.minio.ObjectStat;
import io.minio.PutObjectOptions;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.SneakyThrows;

/**
 * minio上傳,下載,刪除接口
 * @author:溪雲閣
 * @date:2020年6月7日
 */
@SuppressWarnings("deprecation")
@Api(tags = { "web服務:minio上傳,下載,刪除接口" })
@RestController
@RequestMapping("view/minio")
public class MinioView {

    @Autowired
    private MinioClient minioClient;

    @Autowired
    private MinioData minioData;

    /**
     * 下載文件
     * @author 溪雲閣  void
     */
    @ApiOperation(value = "下載文件")
    @GetMapping(value = "/download")
    @SneakyThrows(Exception.class)
    public void download(@RequestParam("fileName") String fileName, HttpServletResponse response) {
        InputStream in = null;
        final ObjectStat stat = minioClient.statObject(minioData.getBucketName(), fileName);
        response.setContentType(stat.contentType());
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
        in = minioClient.getObject(minioData.getBucketName(), fileName);
        IOUtils.copy(in, response.getOutputStream());
        in.close();
    }

    /**
     * 上傳文件
     * @author 溪雲閣
     * @param file
     * @return
     * @throws Exception ResponseMsg<String>
     */
    @ApiOperation(value = "上傳文件")
    @PostMapping(value = "/upload")
    @SneakyThrows(Exception.class)
    public ResponseMsg<String> upload(@RequestParam("file") MultipartFile file) throws Exception {
        if (file.isEmpty()) {
            throw new CommonRuntimeException("上傳文件不能爲空");
        } else {
            // 得到文件流
            final InputStream is = file.getInputStream();
            // 文件名
            final String fileName = file.getOriginalFilename();
            // 把文件放到minio的boots桶裏面
            minioClient.putObject(minioData.getBucketName(), fileName, is, new PutObjectOptions(is.available(), -1));
            // 關閉輸入流
            is.close();
            return MsgUtils.buildSuccessMsg("上傳成功");
        }
    }

    /**
     * 刪除文件
     * @author 溪雲閣
     * @param fileName
     * @return ResponseMsg<String>
     */
    @ApiOperation(value = "刪除文件")
    @GetMapping(value = "/delete", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @SneakyThrows(Exception.class)
    public ResponseMsg<String> delete(@RequestParam("fileName") String fileName) {
        minioClient.removeObject(minioData.getBucketName(), fileName);
        return MsgUtils.buildSuccessMsg("刪除成功");
    }

}

測試

運行後,我們查看接口文檔,已經寫好3個方法了

springboot2.2.X手冊:放棄fastdfs,整合Minio做文件服務器真香

 

springboot2.2.X手冊:放棄fastdfs,整合Minio做文件服務器真香

 

--END--

作者:@溪雲閣

原創作品,抄襲必究,轉載註明出處

如需要源碼,轉發,關注後私信我

部分圖片或代碼來源網絡,如侵權請聯繫刪除,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章