在Linux系统下搭建和配置一个minio文件服务器(二)

上一篇主要讲述了在linux系统中搭建一个minio文件服务器,那么这一篇则用来整合java代码中使用,我之前自己已经搭建好了一个springboot项目,那么这一篇将详细讲述如何把minio整合进springboot中,特此说明,本篇只会贴出关于minio的关键代码,至于如何搭建springboot请个人百度或者参考本人即将会写的博客,项目完整代码请到GitHub:https://github.com/Slience-zae/mail-demo.git。废话不多说,上操作步骤。

一、添加配置信息至配置文件

pom文件依赖:文件服务器 + 流操作依赖

 <!--minio文件服务器-->
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>6.0.11</version>
        </dependency>
        <!--commons-io 流操作 (可选)-->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

 yum文件依赖:minio文件服务器的访问地址以及使用密钥(登录访问时会验证)

# minio 文件存储配置信息
minio:
  endpoint: http://192.168.159.129:9000
  accesskey: minioadmin
  secretKey: minioadmin

 propertise文件依赖:存储桶的名称(直接在代码写也能完成,但是为了灵活配置,所以最好将这种信息写在配置文件里面,通过注解方式读取注入到使用的字段中)

#存储桶的key
Bucket.Name=product

 二、代码配置

1.创建实体类MinioProp,用于属性封装,将yum文件中的访问路径,密钥等信息封装进该实体类中。

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * minio 属性值
 */
@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioProp {
    /**
     * 连接url
     */
    private String endpoint;
    /**
     * 用户名
     */
    private String accesskey;
    /**
     * 密码
     */
    private String secretKey;
}

2.编写minio的核心配置类,提供生成MinioClient对象的方法

import com.maven.maildemo.config.vo.MinioProp;
import io.minio.MinioClient;
import io.minio.errors.InvalidEndpointException;
import io.minio.errors.InvalidPortException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * minio 核心配置类
 */
@Configuration
@EnableConfigurationProperties(MinioProp.class)
public class MinioConfiguration {

    @Autowired
    private MinioProp minioProp;

    /**
     * 获取 MinioClient
     *
     * @return
     * @throws InvalidPortException
     * @throws InvalidEndpointException
     */
    @Bean
    public MinioClient minioClient() throws InvalidPortException, InvalidEndpointException {
        return new MinioClient(minioProp.getEndpoint(), minioProp.getAccesskey(), minioProp.getSecretKey());
    }
}

三、上传、下载方法的实现

import io.minio.MinioClient;
import io.minio.ObjectStat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.apache.commons.io.IOUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

/**
 * minio文件管理,上传,下载文件
 */
@RestController
@RequestMapping("/minio")
public class MinioController {
    @Autowired
    private MinioClient minioClient;

    @Value("${Bucket.Name}")
    private String bucketName;

    /**
     * 从minio服务器下载文件
     * @param request
     * @param response
     * @param fileName
     */
    @PostMapping("/download")
    private void download(HttpServletRequest request, HttpServletResponse response,String fileName){
        InputStream in = null;
        //获取文件对象 start原信息
        try {
            ObjectStat stat = minioClient.statObject(bucketName,fileName);
            response.setContentType(stat.contentType());
            //response.setContentType("application/octet-stream;charset=UTF-8");
            in = minioClient.getObject(bucketName,fileName);
            IOUtils.copy(in,response.getOutputStream());
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(in!=null){
                try {
                    //关闭流操作
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 上传文件
     * @param file
     * @param request
     * @return
     */
    @PostMapping("/upload")
    public String upload(@RequestParam(value = "file") MultipartFile file, HttpServletRequest request){
        if(file == null || file.getSize() == 0){
            return "上传文件不能为空";
        }
        //获取文件的真实名称
        String orgfileName = file.getOriginalFilename();
        try {
            //获取文件的输入流信息
            InputStream in = file.getInputStream();
            //得到内容的类型
            String contententType = file.getContentType();
            //上传到文件服务器:桶key,文件名,文件的io信息
            minioClient.putObject(bucketName,orgfileName,in,null,null,null,contententType);
            //封装了文件桶名,文件名等信息.如果前端需要则封装进实体返回给前端,不需要则不用写
            Map<String,Object> data = new HashMap<>();
            data.put("bucketName",bucketName);
            data.put("fileName",orgfileName);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "上传成功";
    }
}

需要明白的一点是,minio文件服务器是先创建的存储桶,然后文件是放在存储桶中的,一般来言,我们上传文件到存储桶时会按照一定的格式从新生成一个包含原文件名的文件名称,防止新传入的文件的文件名称与服务器上的文件名称冲突,导致上传失败,我这里只是为了给大家呢演示一下功能,因此不再进行重新生成文件名称,而是直接使用的文件的真实名称。另外,本次搭建也是参考了网上的一篇博客:http://www.tingcream.com/blogArticle/detail/2a396ff149f249de983bb6fae6c4c3a9。本人实际操作搭建成功后才加上了自己的一些改动才写的本篇博客,对以上的一个搭建代码存在疑问,那就是下载文件的代码中finally后面有一个关闭流的操作,但是spring框架应该会默认关闭流的,不需要人为的进行操作,因此我认为finally后的代码完全可以省略。

如有问题,欢迎评论留言。

 

posted @ 2020-05-26 14:24  帝莘  阅读(2633)  评论(0编辑  收藏  举报