MinIO 是高性能的对象存储,是为海量数据存储、人工智能、大数据分析而设计的,它完全兼容Amazon S3接口,单个对象最大可达5TB,适合存储海量图片、视频、日志文件、备份数据和容器/虚拟机镜像等。MinIO主要采用Golang语言实现,,客户端与存储服务器之间采用http/https通信协议。
上文讲解了minio如何部署
本文演示如何集成程序
一、配置yml文件
- #yml配置文件增加如下配置
-
- minio:
- endpoint: http://ip:9000
- fileUploadUrl: http://ip:9000
- accessKey: minioadmin (用户名)
- secretKey: minioadmin (密码)
- bucketName: file (文件组:桶名)
二、引入pom(8与7的方法不适用,以下使用8.0.3)
-
-
io.minio -
minio -
8.0.3 -
三、系统加载minio配置
- @Data
- @Configuration
- @ConfigurationProperties(prefix = "minio")
- public class MinioConfig {
-
- private String endpoint;
- private String accessKey;
- private String secretKey;
- private String bucketName;
-
- @Bean
- public MinioClient minioClient() {
- MinioClient minioClient = MinioClient.builder()
- .endpoint(endpoint)
- .credentials(accessKey, secretKey)
- .build();
- return minioClient;
- }
-
- }
四、minio工具类(上传文件,返回访问链接)
- package org;
-
- import cn.hutool.core.io.FastByteArrayOutputStream;
- import com.alibaba.fastjson.JSONObject;
- import io.minio.*;
- import io.minio.http.Method;
- import io.minio.messages.Bucket;
- import io.minio.messages.DeleteError;
- import io.minio.messages.DeleteObject;
- import io.minio.messages.Item;
- import org.springframework.stereotype.Component;
- import org.springframework.web.multipart.MultipartFile;
-
- import javax.annotation.Resource;
- import javax.servlet.ServletOutputStream;
- import javax.servlet.http.HttpServletResponse;
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.UUID;
- import java.util.stream.Collectors;
-
- /**
- * 功能描述 文件服务器工具类
- *
- * @author:
- * @date:
- */
- @Component
- public class MinioUtil {
-
- @Resource
- private MinioClient minioClient;
-
- /**
- * 查看存储bucket是否存在
- * @return boolean
- */
- public Boolean bucketExists(String bucketName) {
- Boolean found;
- try {
- found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
- } catch (Exception e) {
- //e.printStackTrace();
- return false;
- }
- return found;
- }
-
- /**
- * 创建存储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
- * @return Boolean
- */
- public Boolean removeBucket(String bucketName) {
- try {
- minioClient.removeBucket(RemoveBucketArgs.builder()
- .bucket(bucketName)
- .build());
- } catch (Exception e) {
- e.printStackTrace();
- return false;
- }
- return true;
- }
- /**
- * 获取全部bucket
- */
- public List
getAllBuckets() { - try {
- return minioClient.listBuckets();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
-
- /**
- * 文件上传
- * @param file 文件
- * @return Boolean
- */
- public Boolean upload(String bucketName, String fileName, MultipartFile file, InputStream inputStream) {
- try {
- PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(bucketName).object(fileName)
- .stream(inputStream,file.getSize(),-1).contentType(file.getContentType()).build();
- //文件名称相同会覆盖
- minioClient.putObject(objectArgs);
- } catch (Exception e) {
- e.printStackTrace();
- return false;
- }
- return true;
- }
-
- /**
- * 预览图片
- * @param fileName
- * @return
- */
- public String preview(String fileName,String bucketName){
- // 查看文件地址
- GetPresignedObjectUrlArgs build = new GetPresignedObjectUrlArgs().builder().bucket(bucketName).object(fileName).method(Method.GET).build();
- try {
- String url = minioClient.getPresignedObjectUrl(build);
- return url;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
-
- /**
- * 文件下载
- * @param fileName 文件名称
- * @param res response
- * @return Boolean
- */
- public void download(String fileName,String bucketName, HttpServletResponse res) {
- GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(bucketName)
- .object(fileName).build();
- try (GetObjectResponse response = minioClient.getObject(objectArgs)){
- byte[] buf = new byte[1024];
- int len;
- try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()){
- while ((len=response.read(buf))!=-1){
- os.write(buf,0,len);
- }
- os.flush();
- byte[] bytes = os.toByteArray();
- res.setCharacterEncoding("utf-8");
- //设置强制下载不打开
- //res.setContentType("application/force-download");
- res.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
- try (ServletOutputStream stream = res.getOutputStream()){
- stream.write(bytes);
- stream.flush();
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- /**
- * 查看文件对象
- * @return 存储bucket内文件对象信息
- */
- public List
- listObjects(String bucketName) {
- Iterable
> results = minioClient.listObjects( - ListObjectsArgs.builder().bucket(bucketName).build());
- List
- items = new ArrayList<>();
- try {
- for (Result
- result : results) {
- items.add(result.get());
- }
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- return items;
- }
-
- /**
- * 删除
- * @param fileName
- * @return
- * @throws Exception
- */
- public boolean remove(String fileName,String bucketName){
- try {
- minioClient.removeObject( RemoveObjectArgs.builder().bucket(bucketName).object(fileName).build());
- }catch (Exception e){
- return false;
- }
- return true;
- }
-
- /**
- * 批量删除文件对象(没测试)
- * @param objects 对象名称集合
- */
- public Iterable
> removeObjects(List objects, String bucketName) { - 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;
- }
-
- //上传文件,返回路径
- public Object upload(HashMap
paramMap) { - MultipartFile file=(MultipartFile)paramMap.get("file");
- if (file.isEmpty() || file.getSize() == 0) {
- return "文件为空";
- }
- try {
- if (!this.bucketExists("file")) {
- this.makeBucket("file");
- }
- InputStream inputStream = file.getInputStream();
- String fileName = file.getOriginalFilename();
-
- String newName = UUID.randomUUID().toString().replaceAll("-", "")
- + fileName.substring(fileName.lastIndexOf("."));
-
- this.upload("file", newName,file, inputStream);
- inputStream.close();
- String fileUrl = this.preview(newName,"file");
- String fileUrlNew=fileUrl.substring(0, fileUrl.indexOf("?"));
- JSONObject jsonObject=new JSONObject();
- jsonObject.put("url",fileUrlNew);
- return jsonObject.toJSONString();
- } catch (Exception e) {
- e.printStackTrace();
- return "上传失败";
- }
- }
- }