文件minio进阶 分页查询

203 阅读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中重新查询出来,并且路径是有过期时间的

本文转自 jimolvxing.blog.csdn.net/article/det…,如有侵权,请联系删除。