最近买了一个服务器,但没有买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;
)
@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);
}