MinIO 是在 GNU Affero 通用公共许可证 v3.0 下发布的高性能对象存储。它与 Amazon S3 云存储服务

API 兼容。使用 MinIO 为机器学习、分析和应用程序数据工作负载构建高性能基础架构。
MinIO是高性能对象存储,什么是对象存储(Object Storage Service),对象存储是支持海量用户远程访问的无限容量廉价存储系统,既然是存储系统。

它由桶(bucket,对应Windows下的文件夹),组成目录结构,桶中直接存放对象(Object,对应
Windwos下的文件),桶中不能再创建通,但是要能创建文件夹

参考官网上的内容,官网地址如下:https://docs.min.io/

Windows使用

一、下载和本地启动MinIO

  1. 下载MinIO,访问官网:https://docs.min.io/
  2. 将MinIO.exe 拷贝到自己的目录下去,并创建一个data目录
  3. 通过命令行启动Minio:minio server ./data
  4. 启动完成后,可以看到访问的路径 http://127.0.0.1:9000
  5. 使用提供的账号密码进行登录
    账号:minioadmin
    密码:minioadmin
    说明minio已经正常启动了
    在这里插入图片描述

二、MioIO的使用

由于我们已经了解到MinIO是由桶(bucket)组成的,相当于是文件夹
对应的应该先要创建通bucket
创建桶:创建名叫huike-crm的桶
先尝试通过MinIO的浏览器上传一个文件,点击copy拷贝生成分享的url
在这里插入图片描述
在这里插入图片描述
在浏览器里访问,可以看到上传的图片
可以看到图片里的内容,证明minio已经可以正常使用了
但是,存在一些问题,我们生成一个分享url的时候发现有一个有效期
也就是说我们生成的分享的url的有效期只有7天,过了这7天以后再想通过这个url来进行访问就会有问题

那么我们能否直接将上传上来的文件暴露出去,而不再需要通过分享的这个url来进行访问呢?
如果现在我们要直接访问我们的MinIO里的文件要如何访问
我们应该直接访问 Minio的ip+端口/桶名称/文件名
http://172.16.17.121:9000/huike-crm/java.png
我们在浏览器中尝试了一下,看到返回的数据的内容,没有权限
注意这里的权限的配置是在桶这一级别的,添加读取readOnly对应的权限是*即拥有所有权限
在这里插入图片描述
然后重新访问java.png,http://127.0.0.1:9000/huike-crm/Snipaste_2022-12-31_17-24-29.png 即可看到图片
在这里插入图片描述

Java访问MinIO

官网手册:https://min.io/docs/minio/linux/developers/java/API.html

1.先导入依赖

<dependency>
	<groupId>io.minio</groupId>
	<artifactId>minio</artifactId>
	<version>8.3.7</version>
</dependency>

2.编写配置

2.1 编写配置文件

yml配置

# Miniio配置
minio:
  # minio服务所在的目标ip
  endpoint: http://127.0.0.1
  # 端口
  port: 9000
  # 登录时的账户
  accessKey: minioadmin
  # 密码
  secretKey: minioadmin
  # 存储的桶
  bucketName: huike-crm

MinIO配置文件

@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {

    //ip地址
    private String endpoint;
    //端口号
    private int port;
    //账户名
    private String accessKey;
    //密码
    private String secretKey;
    //默认存储桶
    private String bucketName;
}

Controller层编写


/**
 * 通用请求处理
 */
@RestController
public class CommonController extends BaseController {

    @Autowired
    private ISysFileService fileService;

    /**
     * 通用上传请求
     */
    @PostMapping("/common/upload")
    public AjaxResult uploadFile(MultipartFile file) throws Exception {
        return fileService.upload(file);
    }
}

Service层编写

@Service
@Slf4j
public class SysFileServiceImpl implements ISysFileService {

    @Autowired
    private MinioConfig minioConfig;

    /**
     * 文件上传至Minio
     */
    @Override
    public AjaxResult upload(MultipartFile file) throws Exception {

        try {
            //判断文件是否是pdf格式
            if (!file.getContentType().equals("application/pdf") ){
                return AjaxResult.error("只能上传pdf文件");
            }

            //截取文件后缀然后拼接新的文件名 uuid + 后缀
            String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().indexOf("."));
            String newFileName = UUID.randomUUID().toString(true) + suffix;

            //创建Minio的连接对象
            MinioClient minioClient = MinioClient.builder()
                    .endpoint(minioConfig.getEndpoint() + ":" + minioConfig.getPort())
                    .credentials(minioConfig.getAccessKey(), minioConfig.getSecretKey())
                    .build();

            //判断文件存储的桶是否存在
            boolean flag = minioClient.bucketExists(
                    BucketExistsArgs.builder().bucket(minioConfig.getBucketName()).build()
            );
            //判断是否存在该桶
            if (!flag) {
                //不存在就创建
                minioClient.makeBucket(
                        MakeBucketArgs.builder().bucket(minioConfig.getBucketName()).build()
                );
            }

            //上传到桶中的文件的路径 使用当前日期作为文件存储路径
            String data = new SimpleDateFormat("yyyy/MM/dd").format(new Date()) + "/";

            //操作文件,文件上传
            minioClient.putObject(
                    PutObjectArgs.builder().bucket(minioConfig.getBucketName())
                            .object(data + newFileName)
                            .stream(file.getInputStream(), -1, 10485760)
                            .contentType(file.getContentType())
                            .build());


            //封装访问的url给前端 http://127.0.0.1:9000/桶名/路径/文件名
            String url = minioConfig.getEndpoint() + ":" + minioConfig.getPort() + "/" + minioConfig.getBucketName() + "/" + data + newFileName;
            //fileName /桶名/路径/文件名
            String fileName = "/" + minioConfig.getBucketName() + "/" + data + newFileName;
            AjaxResult success = AjaxResult.success();
            success.put("url",url);
            success.put("fileName",fileName);
            return success;
        } catch (MinioException e) {
            System.out.println("Error occurred: " + e);
            System.out.println("HTTP trace: " + e.httpTrace());
        }
        return null;
    }

}
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐