自建MinIO对象存储服务

最近买了一个服务器,但没有买OSS,所以想着自己在服务器建立oss。

MinIO 是一款基于Go语言的高性能对象存储服务,在Github上已有19K+Star。它采用了Apache License v2.0开源协议,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。

 

MinIO安装

使用docker安装,docker的安装就不说了,我之前也有写。

下载MinIO的Docker镜像:

docker pull minio/minio

在Docker容器中运行MinIO

docker run -p 9090:9000 --name minio \
  -v /mydata/minio/data:/data \
  -v /mydata/minio/config:/root/.minio \
  -d minio/minio server /data

这里我们将MiniIO的数据和配置文件夹挂在到宿主机上。

访问 http://192.168.6.132:9090 

 

默认Access Key和Secret都是minioadmin

 

 创建一个bucket

修改访问策略为只读

 

 需要注意的是,访问前缀需要设置为*.*,否则会无法访问;

 

 

 然后我们整合到项目中去。

整合使用

引入依赖

<!--MinIO JAVA SDK-->
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>3.0.10</version>
</dependency>

在SpringBoot中开启文件上传功能

spring:
  servlet:
    multipart:
      enabled: true #开启文件上传
      max-file-size: 10MB #限制文件上传大小为10M

默认是1mb。

一个文件上传的接口:


@Value("${minio.endpoint}")
private String ENDPOINT;
@Value("${minio.bucketName}")
private String BUCKET_NAME;
@Value("${minio.accessKey}")
private String ACCESS_KEY;
@Value("${minio.secretKey}")
private String SECRET_KEY;
    
@PreAuthorize("hasAuthority('music:add')") @ApiOperation("添加歌曲") @PostMapping("uploadMusic") public CommonResult uploadMusic(@RequestParam("file") MultipartFile file, @ModelAttribute Music music){ try { // 创建一个MinIO的Java客户端 MinioClient minioClient = new MinioClient(ENDPOINT, ACCESS_KEY, SECRET_KEY); boolean isExist = minioClient.bucketExists(BUCKET_NAME); if (isExist) { LOGGER.info("存储桶已经存在!"); } else { //创建存储桶并设置只读权限 minioClient.makeBucket(BUCKET_NAME); minioClient.setBucketPolicy(BUCKET_NAME, "*.*", PolicyType.READ_ONLY); } String fileName = file.getOriginalFilename(); if(fileName == null){ return CommonResult.failed("歌曲名为空"); } SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); // 设置存储对象名称 String objectName = sdf.format(new Date()) + "/" + fileName; minioClient.putObject(BUCKET_NAME, objectName, file.getInputStream(), file.getContentType()); Music music1 = new Music(); music1.setMusicName(music.getMusicName()); music1.setMusicUrl(ENDPOINT + "/" + BUCKET_NAME + "/" + objectName); music1.setSingerName(music.getSingerName()); musicService.insert(music1); LOGGER.info("上传歌曲路径:" + ENDPOINT + "/" + BUCKET_NAME + "/" + objectName); } catch (Exception e) { LOGGER.info("上传发生错误: {}!", e.getMessage()); e.printStackTrace(); } return CommonResult.success(null); }

 

posted @ 2020-06-18 16:57  SunSAS  阅读(1503)  评论(0编辑  收藏  举报