在Linux系统下搭建和配置一个minio文件服务器(二)
<p>上一篇主要讲述了在linux系统中搭建一个minio文件服务器,那么这一篇则用来整合java代码中使用,我之前自己已经搭建好了一个springboot项目,那么这一篇将详细讲述如何把minio整合进springboot中,特此说明,本篇只会贴出关于minio的关键代码,至于如何搭建springboot请个人百度或者参考本人即将会写的博客,项目完整代码请到GitHub:https://github.com/Slience-zae/mail-demo.git。废话不多说,上操作步骤。</p><p>一、添加配置信息至配置文件</p>
<p>pom文件依赖:文件服务器 + 流操作依赖</p>
<div class="cnblogs_Highlighter">
<pre class="brush:java;gutter:false;"> <!--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>
</pre>
</div>
<p> yum文件依赖:minio文件服务器的访问地址以及使用密钥(登录访问时会验证)</p>
<div class="cnblogs_Highlighter">
<pre class="brush:java;gutter:false;"># minio 文件存储配置信息
minio:
endpoint: http://192.168.159.129:9000
accesskey: minioadmin
secretKey: minioadmin
</pre>
</div>
<p> propertise文件依赖:存储桶的名称(直接在代码写也能完成,但是为了灵活配置,所以最好将这种信息写在配置文件里面,通过注解方式读取注入到使用的字段中)</p>
<div class="cnblogs_Highlighter">
<pre class="brush:java;gutter:false;">#存储桶的key
Bucket.Name=product
</pre>
</div>
<p> 二、代码配置</p>
<p>1.创建实体类MinioProp,用于属性封装,将yum文件中的访问路径,密钥等信息封装进该实体类中。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> lombok.Data;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.boot.context.properties.ConfigurationProperties;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.stereotype.Component;
</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
* minio 属性值
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
@Data
@Component
@ConfigurationProperties(prefix </span>= "minio"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> MinioProp {
</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
* 连接url
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String endpoint;
</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
* 用户名
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String accesskey;
</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
* 密码
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String secretKey;
}</span></pre>
</div>
<p>2.编写minio的核心配置类,提供生成MinioClient对象的方法</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> com.maven.maildemo.config.vo.MinioProp;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> io.minio.MinioClient;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> io.minio.errors.InvalidEndpointException;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> io.minio.errors.InvalidPortException;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.beans.factory.annotation.Autowired;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.boot.context.properties.EnableConfigurationProperties;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.context.annotation.Bean;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.context.annotation.Configuration;
</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
* minio 核心配置类
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
@Configuration
@EnableConfigurationProperties(MinioProp.</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> MinioConfiguration {
@Autowired
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> MinioProp minioProp;
</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
* 获取 MinioClient
*
* </span><span style="color: rgba(128, 128, 128, 1)">@return</span><span style="color: rgba(0, 128, 0, 1)">
* </span><span style="color: rgba(128, 128, 128, 1)">@throws</span><span style="color: rgba(0, 128, 0, 1)"> InvalidPortException
* </span><span style="color: rgba(128, 128, 128, 1)">@throws</span><span style="color: rgba(0, 128, 0, 1)"> InvalidEndpointException
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
@Bean
</span><span style="color: rgba(0, 0, 255, 1)">public</span> MinioClient minioClient() <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> InvalidPortException, InvalidEndpointException {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MinioClient(minioProp.getEndpoint(), minioProp.getAccesskey(), minioProp.getSecretKey());
}
}</span></pre>
</div>
<p>三、上传、下载方法的实现</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> io.minio.MinioClient;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> io.minio.ObjectStat;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.beans.factory.annotation.Autowired;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.beans.factory.annotation.Value;
</span><span style="color: rgba(0, 0, 255, 1)">import</span> org.springframework.web.bind.annotation.*<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.apache.commons.io.IOUtils;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.web.multipart.MultipartFile;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> javax.servlet.http.HttpServletRequest;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> javax.servlet.http.HttpServletResponse;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.io.IOException;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.io.InputStream;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.HashMap;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.Map;
</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
* minio文件管理,上传,下载文件
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
@RestController
@RequestMapping(</span>"/minio"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> MinioController {
@Autowired
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> MinioClient minioClient;
@Value(</span>"${Bucket.Name}"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String bucketName;
</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
* 从minio服务器下载文件
* </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> request
* </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> response
* </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> fileName
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
@PostMapping(</span>"/download"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> download(HttpServletRequest request, HttpServletResponse response,String fileName){
InputStream in </span>= <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取文件对象 start原信息</span>
<span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
ObjectStat stat </span>=<span style="color: rgba(0, 0, 0, 1)"> minioClient.statObject(bucketName,fileName);
response.setContentType(stat.contentType());
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">response.setContentType("application/octet-stream;charset=UTF-8");</span>
in =<span style="color: rgba(0, 0, 0, 1)"> minioClient.getObject(bucketName,fileName);
IOUtils.copy(in,response.getOutputStream());
} </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
e.printStackTrace();
}</span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(in!=<span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">关闭流操作</span>
<span style="color: rgba(0, 0, 0, 1)"> in.close();
} </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (IOException e) {
e.printStackTrace();
}
}
}
}
</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
* 上传文件
* </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> file
* </span><span style="color: rgba(128, 128, 128, 1)">@param</span><span style="color: rgba(0, 128, 0, 1)"> request
* </span><span style="color: rgba(128, 128, 128, 1)">@return</span>
<span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
@PostMapping(</span>"/upload"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">public</span> String upload(@RequestParam(value = "file"<span style="color: rgba(0, 0, 0, 1)">) MultipartFile file, HttpServletRequest request){
</span><span style="color: rgba(0, 0, 255, 1)">if</span>(file == <span style="color: rgba(0, 0, 255, 1)">null</span> || file.getSize() == 0<span style="color: rgba(0, 0, 0, 1)">){
</span><span style="color: rgba(0, 0, 255, 1)">return</span> "上传文件不能为空"<span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取文件的真实名称</span>
String orgfileName =<span style="color: rgba(0, 0, 0, 1)"> file.getOriginalFilename();
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取文件的输入流信息</span>
InputStream in =<span style="color: rgba(0, 0, 0, 1)"> file.getInputStream();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">得到内容的类型</span>
String contententType =<span style="color: rgba(0, 0, 0, 1)"> file.getContentType();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">上传到文件服务器:桶key,文件名,文件的io信息</span>
minioClient.putObject(bucketName,orgfileName,in,<span style="color: rgba(0, 0, 255, 1)">null</span>,<span style="color: rgba(0, 0, 255, 1)">null</span>,<span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">,contententType);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">封装了文件桶名,文件名等信息.如果前端需要则封装进实体返回给前端,不需要则不用写</span>
Map<String,Object> data = <span style="color: rgba(0, 0, 255, 1)">new</span> HashMap<><span style="color: rgba(0, 0, 0, 1)">();
data.put(</span>"bucketName"<span style="color: rgba(0, 0, 0, 1)">,bucketName);
data.put(</span>"fileName"<span style="color: rgba(0, 0, 0, 1)">,orgfileName);
} </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
e.printStackTrace();
}
</span><span style="color: rgba(0, 0, 255, 1)">return</span> "上传成功"<span style="color: rgba(0, 0, 0, 1)">;
}
}</span></pre>
</div>
<p>需要明白的一点是,minio文件服务器是先创建的存储桶,然后文件是放在存储桶中的,一般来言,我们上传文件到存储桶时会按照一定的格式从新生成一个包含原文件名的文件名称,防止新传入的文件的文件名称与服务器上的文件名称冲突,导致上传失败,我这里只是为了给大家呢演示一下功能,因此不再进行重新生成文件名称,而是直接使用的文件的真实名称。另外,本次搭建也是参考了网上的一篇博客:http://www.tingcream.com/blogArticle/detail/2a396ff149f249de983bb6fae6c4c3a9。本人实际操作搭建成功后才加上了自己的一些改动才写的本篇博客,对以上的一个搭建代码存在疑问,那就是下载文件的代码中<span style="color: rgba(0, 0, 255, 1)">finally</span>后面有一个关闭流的操作,但是spring框架应该会默认关闭流的,不需要人为的进行操作,因此我认为<span style="color: rgba(0, 0, 255, 1)">finally</span>后的代码完全可以省略。</p>
<p>如有问题,欢迎评论留言。</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/zaevn00001/p/12965172.html
頁:
[1]