自建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); }