文章目录
- 前言
- 一、minio使用
- 二、代码
- 1.mino版本是最新的,那么pom中也要最新的
- 2. 部分代码
- 总结
前言
就是现在通过minio管理文件,然后不需要其他信息,所以我也就没有用传统方式,在mysql中做文件记录,直接用minio做了文件存储,以及文件查询;
一、minio使用
1 docker 安装最新版minio.开通9000端口,默认用户名密码: minioAdmin/minioAdmin
2 创建存储桶,选择存储桶,edit policy >>> add,会多一行,没错,就是他
这个的作用是: 减少文件路径长度,长期有效,这样文件的路径变为: ip:9000/通名称/文件名称
3 根据创建好的桶.配置到项目中,获取accessKey secretKey 一般这两个与 minio 的用户名密码不一致
二、代码
1.mino版本是最新的,那么pom中也要最新的
minio 8.2.1
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>minio 8.2.1</version>
</dependency>
具体配置这里不一一列举了;
2. 部分代码
上传
public Map<String, String> upload(MultipartFile file) throws Exception {
Map<String, String> map = new HashMap<>();
String fileName = file.getOriginalFilename();
PutObjectArgs args = PutObjectArgs.builder().bucket(minioConfig.getBucketName()).object(fileName).stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build();
minioClient.putObject(args);
String url = minioConfig.getFilePrefix() + fileName;
log.info("上传文件的路径:{}", url);
map.put(fileName, url);
return map;
}
分页查询,包括文件文件名称过滤
public PageInfo<Map<String, String>> page(FilePageDto filePageDto) throws Exception {
List<Map<String, String>> list = CollectionUtil.newArrayList();
if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(minioConfig.getBucketName()).build())) {
ExceptionUtil.wrapRuntime("请先创建文件桶" + minioConfig.getBucketName());
}
Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(minioConfig.getBucketName()).build());
Map<String, String> map;
for (Result<Item> result : results) {
map = new HashMap<>();
String originalFilename = result.get().objectName();
// 条件为空,不过滤,直接返回
if (StrUtil.isBlank(filePageDto.getFileName())) {
map.put(originalFilename, minioConfig.getFilePrefix() + originalFilename);
list.add(map);
} else {//需要过滤
for (String fileName : filePageDto.getFileNameList()) {
if (ObjectUtil.equals(originalFilename, fileName)) {
map.put(originalFilename, minioConfig.getFilePrefix() + originalFilename);
list.add(map);
}
}
}
}
return NebulaUtil.startPage(list, filePageDto.getPageNum(), filePageDto.getPageSize());
}
分页具体代码
public static <T> PageInfo<T> startPage(List<T> list, Integer pageNum, Integer pageSize) {
//创建Page类
Page page = new Page(pageNum, pageSize);
//为Page类中的total属性赋值
page.setTotal(list.size());
//计算当前需要显示的数据下标起始值
int startIndex = (pageNum - 1) * pageSize;
int endIndex = Math.min(startIndex + pageSize, list.size());
//从链表中截取需要显示的子链表,并加入到Page
page.addAll(list.subList(startIndex, endIndex));
//以Page创建PageInfo
PageInfo pageInfo = new PageInfo<>(page);
return pageInfo;
}
删除等其他
@DeleteMapping(value = "/delete")
@ApiOperation("根据文件真实名称删除文件")
public R delete(String filetName) throws Exception {
// 删除文件夹下的对应文件
minioClient.removeObject(RemoveObjectArgs.builder().bucket(minioConfig.getBucketName()).object(filetName).build());
return R.success("删除成功");
}
@GetMapping(value = "/getUrl")
@ApiOperation("根据文件真实名称获取文件路径")
public R getUrl(String filetName) throws Exception {
String url = minioConfig.getFilePrefix() + filetName;
return R.data(url);
}
总结
高版本的minio中文件操作等很多代码,都与低版本的minio不一样,这里面偏向入参为一个 对象,然后这个对象利用builder 构造,点进去也有详细的说明;
整体来说用着还是挺爽的,简单易用免费
重点: 千万不要小看这一步
创建存储桶,选择存储桶,edit policy >>> add,会多一行,没错,就是他
不操作的话,文件的路径会非常长,而且文件路径也需要从minio中重新查询出来,并且路径是有过期时间的