上一篇主要讲述了在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后的代码完全可以省略。

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

在Linux系统下搭建和配置一个minio文件服务器(二)的更多相关文章

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

    1.minio文件服务器的介绍 Minio 是一个基于Go语言的对象存储服务.它实现了大部分亚马逊S3云存储服务接口,可以看做是是S3的开源版本,非常适合于存储大容量非结构化的数据,例如图片.视频.日 ...

  2. Linux系统下tomcat的配置

    Linux系统下tomcat的配置 完成后可以输入命令查看日志文件: 最后进入网页测试下吧: 可以出来这个网页就好了

  3. linux系统下搭建自己的web服务器

    之前在windows 2008 server上搭建了一个用于测试的web服务器,但是在打开网站的时候特别的慢,尤其是图片的加载都会失败,当时以为是路径的问题,但是在服务器上自己打开都特别慢,自己实在找 ...

  4. Linux系统下 为命令配置别名

    1.什么是别名 在管理和维护Linux系统的过程中,将会使用到大量命令,有一些很长的命令或用法经常被用到,重复而频繁的输入某个很长命令或用法是不可取的.这时可以使用 别名 功能将这个过程简单化. Li ...

  5. linux系统下jdk安装配置

    1.有jdk包(linux版) 2.放到linux系统下 3.建议在usr下新建jdk目录之后将jdk文件放到该目录下 3.配置系统信息   /etc/profile 需要配置的信息如下:#set j ...

  6. Linux系统下搭建DNS服务器——DNS原理总结

    2017-01-07 整理 DNS原理 域名到IP地址的解析过程 IP地址到域名的反向域名解析过程 抓包分析DNS报文和具体解析过程 DNS服务器搭建和配置 这个东东也是今年博主参见校招的时候被很多公 ...

  7. linux系统下安装与配置apache

    搭建环境:VMware上虚拟的linux 主机:win  7 安装linux下的Apache前准备: 1.httpd服务的配置文件,默认存储路径:/etc/httpd/conf/httpd.conf( ...

  8. Linux系统下搭建FTP/SFTP服务器

    传输文件经常使用ftp和sftp服务器.Windows下有多种可视化工具,使用快捷.Linux经常需要自行搭建这两种服务器,当然搭建熟练的话,会更加快捷. 1.检查Linux系统是否安装了vsftp和 ...

  9. Linux系统下tomcat安装配置

    Linux系统中Tomcat的安装配置. 前提JDK已经安装好. 安装 下载tomcatwget http://mirrors.cnnic.cn/apache/tomcat/tomcat-8/v8.0 ...

随机推荐

  1. Python目录与文件操作

    一.判断一个路径是否存在 os.path.exists(path) 如果路径存在则返回True,否则返回False. import os import getpass # 获取当前系统用户名 user ...

  2. npm修改默认配置

    1.nodejs在program files下面会造成一些项目中的问题,因此nodejs在program files下需要先卸载nodejs 2.安装nodejs到自定义的目录下面,例:D:\node ...

  3. 单元测试与单元测试框架 Jest

    什么是单元测试? 测试是一种验证我们的代码是否可以按预期工作的手段. 被测试的对象可以是我们程序的任何一个组成部分.大到一个分为多步骤的下单流程,小到代码中的一个函数. 单元测试特指被测试对象为程序中 ...

  4. 没想到吧!关于Dubbo的『消费端线程池模型』官网也写错了。

    这是why的第 63 篇原创文章 荒腔走板 大家好,我是 why,欢迎来到我连续周更优质原创文章的第 63 篇.老规矩,先荒腔走板聊聊其他的. 上面这张图片是我前几天整理相册的时候看到的.拍摄于 20 ...

  5. 【趣味设计模式系列】之【代理模式4--ASM框架解析】

    1. 简介 ASM是assemble英文的简称,中文名为汇编,官方地址https://asm.ow2.io/,下面是官方的一段英文简介: ASM is an all purpose Java byte ...

  6. Python | 详解Python中的协程,为什么说它的底层是生成器?

    今天是Python专题的第26篇文章,我们来聊聊Python当中的协程. 我们曾经在golang关于goroutine的文章当中简单介绍过协程的概念,我们再来简单review一下.协程又称为是微线程, ...

  7. Android开发之Eclipse与Android Studio的java类 作者版权模板

    /** * 作者:${USER} on ${DATE} ${HOUR}:${MINUTE} * * 联系QQ:986945193 * * 微博:http://weibo.com/mcxiaobing ...

  8. P4719 【模板】"动态 DP"&动态树分治

    题目描述 给定一棵 n 个点的树,点带点权. 有 m 次操作,每次操作给定 x,y,表示修改点 x 的权值为 y. 你需要在每次操作之后求出这棵树的最大权独立集的权值大小. 输入格式 第一行有两个整数 ...

  9. Spring源码分析 手写简单IOC容器

    Spring的两大特性就是IOC和AOP. IOC Container,控制反转容器,通过读取配置文件或注解,将对象封装成Bean存入IOC容器待用,程序需要时再从容器中取,实现控制权由程序员向程序的 ...

  10. Codeforces 1389 题解(A-E)

    AC代码 A. LCM Problem 若\(a < b\),则\(LCM(a,b)\)是\(a\)的整数倍且\(LCM(a,b) \ne a\),所以\(LCM(a,b) \ge 2a\),当 ...