可能是全网最详细的springboot整合minio教程

网友投稿 542 2022-07-23


目录安装minio依赖写配置类工具类控制器总结

对象存储服务OSS(Object Storage Service)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。

安装minio

1、进入官网:https://min.io/

我目前安装的是版本是:

在cmd窗口中,命令行进行minio.exe所在的文件夹,输入如下命令 server后面的地址是你图片上传之后的存储目录

minio.exe server E:\minio

因为这里api端口是9000,所以下面的yml需要配置9000端口

accessKey和secretKey需要根据启动的窗口上的值进行配置

bucketName这个需要自己创建

2、启动成功后,访问:127.0.0.1:9000/minio,可以进入到minio的控制台

我们可以在控制台创建bucketName,当然也可以用代码创建

create bucket

其实这个bucketName就是文件夹的意思,我们要把文件上传到哪个bucketName,就是要把文件上传到对应的目录下。

如果需要使用minio,他的服务一定要打开。

依赖

io.minio

minio

8.0.3

yml配置

spring:

# 配置文件上传大小限制

servlet:

multipart:

max-file-size: 200MB

max-request-size: 200MB

minio:

endpoint: http://127.0.0.1:9000

accessKey: minioadmin

secretKey: minioadmin

bucketName: test

写配置类

注册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

puCMbxCMlRIhblic MinioClient minioClient(){

return MinioClient.builder()

.endpoint(endpoint)

.credentials(accessKey, secretKey)

.build();

}

}

工具类

实体类:

@Data

public class ObjectItem {

private String objectName;

private Long size;

}

/**

* @description: minio工具类

* @version:3.0

*/

@Component

public class MinioUtilS {

@Autowired

private MinioClient minioClient;

@Value("${minio.bucketName}")

private String bucketName;

/**

* description: 判断bucket是否存在,不存在则创建

*

* @return: void

*/

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 存储bucket名称

* @return Boolean

*/

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 存储bucket名称

* @return Boolean

*/

public Boolean removeBucket(String bucketName) {

try {

minioClient.removeBucket(RemoveBucketArgs.builder()

.bucket(bucketName)

.build());

} catch (Exception e) {

e.printStackThttp://race();

return false;

}

return true;

}

/**

* description: 上传文件

*

* @param multipartFile

* @return: java.lang.String

*/

public List upload(MultipartFile[] multipartFile) {

List names = new ArrayList<>(multipartFile.length);

for (MultipartFile file : multipartFile) {

String fileName = file.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 = file.getInputStream();

minioClient.putObject(PutObjectArgs.builder()

.bucket(bucketName)

.object(fileName)

.stream(in, in.available(), -1)

.contentTypehttp://(file.getContentType())

.build()

);

} catch (Exception e) {

e.printStackTrace();

} finally {

if (in != null) {

try {

in.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

names.add(fileName);

}

return names;

}

/**

* description: 下载文件

*

* @param fileName

* @return: org.springframework.http.ResponseEntity

*/

public ResponseEntity download(String fileName) {

ResponseEntity 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(bytes, headers, HttpStatus.OK);

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

if (in != null) {

try {

in.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (out != nulCMbxCMlRIhl) {

out.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

return responseEntity;

}

/**

* 查看文件对象

* @param bucketName 存储bucket名称

* @return 存储bucket内文件对象信息

*/

public List listObjects(String bucketName) {

Iterable> results = minioClient.listObjects(

ListObjectsArgs.builder().bucket(bucketName).build());

List objectItems = new ArrayList<>();

try {

for (Result 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 存储bucket名称

* @param objects 对象名称集合

*/

public Iterable> removeObjects(String bucketName, List objects) {

List dos = objects.stream().map(e -> new DeleteObject(e)).collect(Collectors.toList());

Iterable> results = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(dos).build());

return results;

}

}

控制器

@RestController

@Slf4j

public class MinioController {

@Autowired

private MinIoUtil minIoUtil;

@Autowired

private MinioUtilS minioUtilS;

@Value("${minio.endpoint}")

private String address;

@Value("${minio.bucketName}")

private String bucketName;

@PostMapping("/upload")

public Object upload(MultipartFile file) {

List upload = minioUtilS.upload(new MultipartFile[]{file});

return address+"/"+bucketName+"/"+upload.get(0);

}

}

成功上传:

总结


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:解决swagger2中@ApiResponse的response不起作用
下一篇:Java中NoClassDefFoundError 和 ClassNotFoundException的区别
相关文章

 发表评论

暂时没有评论,来抢沙发吧~