前言
开发中,一般都会单独的分离出一个文件服务器,存储对象存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。大部分我们还在用FastDFS,我要吐槽几句它部署麻烦,也没有管理界面,所以我推荐另一个对象存储服务Minio,肯定让你眼前一亮,有种相见恨晚的感觉。
推荐理由
- 开源免费(是我们考虑的首要元素),高性能
- 长的好看:有漂亮的界面。
为云环境而生:与k8s、etcd、docker等深度集成。
文档详细:提供了Java、JavaScript、Python、Golang、.Net等各种语言的sdk,集成变得更加容易
- 部署简单
docker部署
将MiniIO的数据和配置文件夹挂在到宿主机上
<code>docker
run -p 9090:9000 --name minio \ -e MINIO_ACCESS_KEY=admin -e MINIO_SECRET_KEY=123123123 \ -v /mydata/minio/data:/data \ -v /mydata/minio/config:/root/.minio \ -d minio/minio server /data;
/<code>
访问
springboot 使用minio
1 引入maven
<code><
dependency
><
groupId
>io.miniogroupId
><
artifactId
>minioartifactId
><
version
>7.0.2version
>dependency
>/<code>
2 配置 application.properties
<code>minio.url
= http://192.168
.3.189
:9090
minio.accessKey
= adminminio.secretKey
=123123123
minio.secure
=false
minio.bucketName
=testminio.configDir
=/home/data//<code>
3 注入属性
<code> (prefix ="minio"
)public
class
MinioConfig {private
String
url;private
String
accessKey;private
String
secretKey;private
Boolean
secure;private
String
bucketName;private
String
configDir;public
MinioClient getMinioClient() throws InvalidEndpointException, InvalidPortException { MinioClient minioClient =new
MinioClient(url, accessKey, secretKey,secure);return
minioClient; }public
String
getBucketName() {return
bucketName; }public
String
getConfigDir() {return
configDir; }public
String
getUrl() {return
url; }public
void
setUrl(String
url) {this
.url = url; }public
String
getAccessKey() {return
accessKey; }public
void
setAccessKey(String
accessKey) {this
.accessKey = accessKey; }public
String
getSecretKey() {return
secretKey; }public
void
setSecretKey(String
secretKey) {this
.secretKey = secretKey; }public
Boolean
getSecure() {return
secure; }public
void
setSecure(Boolean
secure) {this
.secure = secure; }public
void
setBucketName(String
bucketName) {this
.bucketName = bucketName; }public
void
setConfigDir(String
configDir) {this
.configDir = configDir; } }/<code>
4 创建工具类
<code>public
class
MinioUtil {private
MinioClient minioClient;public
void
uploadFile(InputStream inputStream,String
objectName) {String
buckName ="test"
;try
{if
(!minioClient.bucketExists(buckName)) { minioClient.makeBucket(buckName); } minioClient.putObject(buckName, objectName, inputStream, inputStream.available(),"image/jpeg"
); }catch
(Exception e) { e.printStackTrace(); } }public
void
downloadFile(String
bucketName,String
fileName,String
originalName, HttpServletResponse response) {try
{ InputStream file = minioClient.getObject(bucketName, fileName);String
filename =new
String
(fileName.getBytes("ISO8859-1"
), StandardCharsets.UTF_8); response.setHeader("Content-Disposition"
,"attachment;filename="
+ filename); ServletOutputStream servletOutputStream = response.getOutputStream(); int len; byte[] buffer =new
byte[1024
];while
((len = file.read(buffer)) >0
) { servletOutputStream.write(buffer,0
, len); } servletOutputStream.flush(); file.close(); servletOutputStream.close(); }catch
(ErrorResponseException e) { e.printStackTrace(); }catch
(Exception e) { e.printStackTrace(); } } }/<code>
5 测试
<code>public
class
GreetingsController
{ MinioUtil minioUtil; (value ="/{name}"
, method = RequestMethod.GET) (HttpStatus.OK)public
StringgreetingText
(@PathVariable String name,HttpServletResponse response)
throws
FileNotFoundException { minioUtil.uploadFile(new
FileInputStream(new
File("C:\\Users\\ctyc\\Desktop\\1.jpg"
)),"test1.jpg"
); minioUtil.downloadFile("test"
,"test1.jpg"
,"t1.jpg"
, response);return
"Hello "
+ name +"!"
; } }/<code>