Springboot統合Minioの妹の詳細なSpringBootチュートリアル(5)

SpringbootはMinioを統合します

Minioとは

Minioは、オブジェクトストレージに基づくApccheのオープンソース軽量ファイルサーバーです。プロトコルはApache License v2.0に基づいており、オープンソースはビジネスに使用できます。

Minioは主に、ファイル、写真、写真、ログファイル、さまざまなバックアップファイルなどの非構造化データを保存するために使用されます。公式ウェブサイトの説明によると、ファイルサイズは数KBから5TBの範囲です。

Minioは非常に便利でフレンドリーなインターフェースを提供し、ドキュメントも非常に豊富です。詳細については、そのドキュメントを参照してください。

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

Minioを選ぶ理由

以前はAliのOSSを使用していましたが、非常に高額でした。その後、使いやすさの点で友好的ではなかったFastDFSを使用しました。

Minioは非常に便利なDockerインストールをサポートしています。エディターの現在のプライベートサーバーは、マルチテナンシーをサポートし、高可用性のためにクラスターマルチノードを使用するDockerインストール方法です。上記のURLには詳細な手順が記載されており、ドキュメントは次のとおりです。まだ非常に豊富です。

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:溪云阁
 * @date202067*/
@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:溪云阁
 * @date202067*/
@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:溪云阁
 * @date202067*/
@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("删除成功");
    }

}

おすすめ

転載: blog.csdn.net/weixin_54707168/article/details/114099496