springboot2.X手册:放弃fastdfs,整合Minio做文件服务器真香
什么是Minio
Minio是Apcche旗下的一款开源的轻量级文件服务器,基于对象存储,协议是基于Apache License v2.0,开源可用于商务。
Minio主要用来存储非结构化的数据,类似文件,图片,照片,日志文件,各类备份文件等,按照官网描述,文件的大小从几KB到5TB。
Minio提供了非常方便,友好的界面,并且文档也是非常丰富,具体可以参考它的docs
https://docs.min.io/cn/minio-quickstart-guide.html
为什么选择Minio
以前小编使用阿里的OSS,但是是真的贵,后来使用FastDFS,在友好度上,并不友善,不过这一块仁者见仁智者见智,不做参考,各位看官按照自己喜欢的就行。
Minio是支持docker安装的,非常方便,小编现在的私人服务器上,就是用的docker安装方式,支持多租户,高可用用集群多节点来做,这个上面的网址都有详细说明,文档还是非常丰富的。
整合Minio
"1.0"?>
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">
4.0.0
com.boots
boots
1.1.0.RELEASE
boots-module-minio
boots-module-minio
http://maven.apache.org
UTF-8
io.minio
minio
7.0.2
com.boots
module-boots-exception
2.0.0.RELEASE
属性类
/**
* 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
*/
@ApiOperation(value = "上传文件")
@PostMapping(value = "/upload")
@SneakyThrows(Exception.class)
public ResponseMsg 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
*/
@ApiOperation(value = "删除文件")
@GetMapping(value = "/delete", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@SneakyThrows(Exception.class)
public ResponseMsg delete(@RequestParam("fileName") String fileName) {
minioClient.removeObject(minioData.getBucketName(), fileName);
return MsgUtils.buildSuccessMsg("删除成功");
}
}
测试
运行后,我们查看接口文档,已经写好3个方法了
作者溪云阁,专注编程教学,架构,JAVA,Python,微服务,机器学习等领域,欢迎关注,一起学习。
好文章,我在看
好文章,我在看
评论