Minio 分布式文件存储方案 + spring boot整合

参考博文

基于容器安装

1
2
3
docker pull minio/minio
# MINIO_ACCESS_KEY、MINIO_SECRET_KEY 为可视化登录界面的账户密码
docker run -p 9000:9000 --name minio1 -e "MINIO_ACCESS_KEY=minio" -e "MINIO_SECRET_KEY=minio123" -v /mnt/data:/data -v /mnt/config:/root/.minio minio/minio server /data

springboot整合依赖

1
2
3
4
5
6
<!--minio文件系统 -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.0.2</version>
</dependency>

配置类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Configuration
public class MinioConfig {
// minio 地址
private static String URL = "http://121.41.72.27:9000";
// 用户ID
private static String ACCESSKEY = "minio";
// 密钥
private static String SECRETKEY = "minio123";

@Bean
public MinioClient minioClient() {
try {
return new MinioClient(URL, ACCESSKEY, SECRETKEY);
}
catch (final Exception e) {
return null;
}
}
}

控制层代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
@RestController
@RequestMapping("view/minio")
public class FileUploadController {

@Autowired
private MinioClient minioClient;

private static final String BUCKET = "img";

@GetMapping(value = "/download")
public void download(@RequestParam("fileName") String fileName, HttpServletResponse response) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, InternalException, XmlParserException, InvalidBucketNameException, ErrorResponseException {
InputStream in = null;
final ObjectStat stat = minioClient.statObject(BUCKET, fileName);
response.setContentType(stat.contentType());
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
in = minioClient.getObject(BUCKET, fileName);
IOUtils.copy(in, response.getOutputStream());
in.close();
}

@PostMapping(value = "/upload")
public String upload(@RequestParam("file") MultipartFile file) throws Exception {
if (file.isEmpty()) {
throw new RuntimeException("上传文件不能为空");
} else {
if(!minioClient.bucketExists(BUCKET)) {
minioClient.makeBucket(BUCKET);
}
// 得到文件流
final InputStream is = file.getInputStream();
// 文件名
final String fileName = file.getOriginalFilename();
// 把文件放到minio的boots桶里面
minioClient.putObject(BUCKET, fileName, is,
new PutObjectOptions(is.available(), -1));
// 关闭输入流
is.close();
String url = minioClient.getObjectUrl(BUCKET, fileName);
return "上传成功, " + url;
}
}

@GetMapping(value = "/delete", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public String delete(@RequestParam("fileName") String fileName) {
try {
minioClient.removeObject(BUCKET, fileName);
return "删除成功";
} catch (Exception e) {
return "删除失败";
}
}

}

至于图片预览,启动容器时,已将存储的文件映射到宿主机上,再结合springboot文件映射即可实现。

如果你觉得有帮助,慷慨如你,可以扫描下面的二维码赞赏一下