一、搭建
1.1、Docker 下 MinIO 安装与配置
Docker 下 MinIO 安装与配置_JAVA·D·WangJing的博客-CSDN博客
1.2、创建存储桶
1.3、创建服务账号
二、创建 springboot 项目
mac idea 创建 springboot 项目_JAVA·D·WangJing的博客-CSDN博客_mac搭建一个springboot项目
三、pom.xml依赖配置
<!--minio-->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.0.3</version>
</dependency>
四、bootstrap.yml 或 application.yml 添加配置
spring:
# 配置文件上传大小限制
servlet:
multipart:
max-file-size: 200GB
max-request-size: 200GB
minio:
endpoint: http://**.**.**.**:8801
accessKey: bx20******k84h
secretKey: 4wL8****************1mok
bucketName: test
五、代码
5.1、MinIoClientConfig 类(注册minio客户端)
package com.wangjing.minio.conf;
import io.minio.MinioClient;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
/**
* @author: wangjing
* @createTime: 2022-09-09 14:31
* @version:
* @Description: 注册minio客户端
*/
@Data
@Component
public class MinIoClientConfig {
@Value("${minio.endpoint}")
private String endpoint;
@Value("${minio.accessKey}")
private String accessKey;
@Value("${minio.secretKey}")
private String secretKey;
/**
* 注入minio 客户端
*
* @return
*/
@Bean
public MinioClient minioClient() {
return MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();
}
}
5.2、MinioService 类(minio工具类)
package com.wangjing.minio.service;
import com.wangjing.minio.entity.ObjectItem;
import io.minio.*;
import io.minio.messages.DeleteError;
import io.minio.messages.DeleteObject;
import io.minio.messages.Item;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author: wangjing
* @createTime: 2022-09-09 14:33
* @version:
* @Description: minio工具类
*/
@Component
public class MinioService {
@Autowired
private MinioClient minioClient;
@Value("${minio.bucketName}")
private String bucketName;
/**
* 判断bucket是否存在,不存在则创建
*
* @param name
*/
public void existBucket(String name) {
try {
boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(name).build());
if (!exists) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(name).build());
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 创建存储bucket
*
* @param bucketName
* @return
*/
public Boolean makeBucket(String bucketName) {
try {
minioClient.makeBucket(MakeBucketArgs.builder()
.bucket(bucketName)
.build());
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 删除存储bucket
*
* @param bucketName
* @return
*/
public Boolean removeBucket(String bucketName) {
try {
minioClient.removeBucket(RemoveBucketArgs.builder()
.bucket(bucketName)
.build());
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 多文件上传
*
* @param multipartFileArr
* @return
*/
public List<String> upload(MultipartFile[] multipartFileArr) {
List<String> names = new ArrayList<>(multipartFileArr.length);
for (MultipartFile file : multipartFileArr) {
names.add(upload(file));
}
return names;
}
/**
* 单文件上传
*
* @param multipartFile
* @return
*/
public String upload(MultipartFile multipartFile) {
String fileName = multipartFile.getOriginalFilename();
String[] split = fileName.split("\\.");
if (split.length > 1) {
fileName = split[0] + "_" + System.currentTimeMillis() + "." + split[1];
} else {
fileName = fileName + System.currentTimeMillis();
}
InputStream in = null;
try {
in = multipartFile.getInputStream();
minioClient.putObject(PutObjectArgs.builder()
.bucket(bucketName)
.object(fileName)
.stream(in, in.available(), -1)
.contentType(multipartFile.getContentType())
.build()
);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return fileName;
}
/**
* 下载文件
*
* @param fileName
* @return
*/
public ResponseEntity<byte[]> download(String fileName) {
ResponseEntity<byte[]> responseEntity = null;
InputStream in = null;
ByteArrayOutputStream out = null;
try {
in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build());
out = new ByteArrayOutputStream();
IOUtils.copy(in, out);
//封装返回值
byte[] bytes = out.toByteArray();
HttpHeaders headers = new HttpHeaders();
try {
headers.add("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
headers.setContentLength(bytes.length);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setAccessControlExposeHeaders(Arrays.asList("*"));
responseEntity = new ResponseEntity<byte[]>(bytes, headers, HttpStatus.OK);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return responseEntity;
}
/**
* 查看文件对象
*
* @param bucketName
* @return
*/
public List<ObjectItem> listObjects(String bucketName) {
Iterable<Result<Item>> results = minioClient.listObjects(
ListObjectsArgs.builder().bucket(bucketName).build());
List<ObjectItem> objectItems = new ArrayList<>();
try {
for (Result<Item> result : results) {
Item item = result.get();
ObjectItem objectItem = new ObjectItem();
objectItem.setObjectName(item.objectName());
objectItem.setSize(item.size());
objectItems.add(objectItem);
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return objectItems;
}
/**
* 批量删除文件对象
*
* @param bucketName
* @param objects
* @return
*/
public Iterable<Result<DeleteError>> removeObjects(String bucketName, List<String> objects) {
List<DeleteObject> dos = objects.stream().map(e -> new DeleteObject(e)).collect(Collectors.toList());
Iterable<Result<DeleteError>> results =
minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(dos).build());
return results;
}
}
5.3、ObjectItem 类(实体类)
package com.wangjing.minio.entity;
import lombok.Data;
/**
* @author: wangjing
* @createTime: 2022-09-09 14:36
* @version:
* @Description: 实体类
*/
@Data
public class ObjectItem {
private String objectName;
private Long size;
}
5.4、MinioController 类(测试接口类)
package com.wangjing.minio.controller;
import com.wangjing.minio.service.MinioService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
* @author:
* @createTime: 2022-09-09 14:37
* @version:
* @Description:
*/
@RestController
@Slf4j
public class MinioController {
@Autowired
private MinioService minioService;
@Value("${minio.endpoint}")
private String address;
@Value("${minio.bucketName}")
private String bucketName;
@PostMapping("/upload")
public Object upload(MultipartFile file) {
String upload = minioUtil.upload(file);
return address + "/" + bucketName + "/" + upload;
}
}
六、测试
6.1、postMan 请求接口
6.2、返回url 通过浏览器打开
发现权限有问题,更改桶的展示权限
再次刷新,可以正常访问
6.3、登录minio 后台管理,查看test 桶数据
注:以上内容仅提供参考和交流,请勿用于商业用途,如有侵权联系本人删除!