SpringBoot集成Minio实现文件上传

2024-06-04 7184阅读

目录

创建Springboot项目

配置上传信息

编写配置文件

编写JAVA测试类

1、文件上传

2、Minio工具类

总结


上一篇文章详细介绍了在Windows环境如何安装服务minio服务器,接下来就是最重要的一部分了,如何通过java代码实现文件相关的操作呢?今天通过SpringBoot来整合Minio示例,实现文件的上传、读取、下载、删除等操作。

windows安装教程:Windows安装Minio(超详细)-CSDN博客

创建Springboot项目

引入minio相关依赖

  
      io.minio
      minio
      8.5.6
  

配置上传信息

在application.yml种添加minio配置

minio:
  config:
    url: http://127.0.0.1:9005 #ip地址
    accessKey: admin #  账号
    secretKey: admin962464 #  密码
    secure: false #如果是true,则用的是https而不是http,默认值是true
    bucketName: "test"  # 桶的名字 相当于文件夹

编写配置文件

@Data
@Configuration
@ConfigurationProperties(prefix = "minio.config")
public class MinioConfig {
    /**
     * 服务地址
     */
    private String url;
    /**
     * 用户名
     */
    private String accessKey;
    /**
     * 密码
     */
    private String secretKey;
    /**
     * 存储桶名称
     */
    private String bucketName;
    @Bean
    public MinioClient getMinioClient() {
        return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();
    }
}

编写JAVA测试类

1、文件上传

Controller

@RestController
@RequestMapping("/file")
@Tag(name = "文件管理")
public class FileController {
    @Autowired
    private UploadService uploadService;
    @PostMapping("upload")
    @Operation(summary = "上传文件")
    public Result upload(@RequestParam("file") MultipartFile file) throws IOException {
        FileVO upload = uploadService.upload(file);
        return new Result().ok(upload);
    }
}

Service

@Slf4j
@Service
public class MinioSysFileServiceImpl implements UploadService {
    // 注入minio配置文件
    @Autowired
    private MinioConfig minioConfig;
    // 注入minio client
    @Autowired
    private MinioClient client;
    @Override
    public FileVO upload(MultipartFile file) {
        FileVO fileVO = new FileVO();
        try {
            // 获取文件真实名称
            String originalFilename = file.getOriginalFilename();
            // 获取文件的扩展名 例如.jpg .doc
            String extname = originalFilename.substring(originalFilename.lastIndexOf("."));
            // 构建文件上传相关信息
            PutObjectArgs args = PutObjectArgs.builder()
                    .bucket(minioConfig.getBucketName())
                    .object(originalFilename)
                    .stream(file.getInputStream(), file.getSize(), -1)
                    .contentType(file.getContentType())
                    .build();
            // 将文件上传到minio服务器
            client.putObject(args);
            log.info("文件上传成功");
            // 组装文件信息,返回前端 或者存入数据路
            String url = minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + originalFilename;
            fileVO.setUrl(url);
            fileVO.setSize(file.getSize());
            fileVO.setFileName(originalFilename);
            fileVO.setExtname(extname);
        } catch (Exception e) {
            throw new ServerException("文件上传异常" + e.getCause().toString());
        }
        return fileVO;
    }
}

文件返回VO

@Data
@Schema(description = "文件信息")
public class FileVO {
    @Schema(description = "文件url")
    private String url;
    @Schema(description = "文件名称")
    private String fileName;
    @Schema(description = "文件大小")
    private Long size;
    @Schema(description = "文件扩展名")
    private String extname;
}

测试结果

SpringBoot集成Minio实现文件上传 第1张

SpringBoot集成Minio实现文件上传 第2张

ok ok ok

SpringBoot集成Minio实现文件上传 第3张

2、Minio工具类

@Configuration
@Slf4j
public class MinioFileUtil {
    @Autowired
    MinioConfig minioConfig;
    @Autowired
    MinioClient minioClient;
    /**
     * 创建桶
     *
     * @param bucketName 桶名称
     */
    public void createBucket(String bucketName) throws Exception {
        if (!StringUtils.hasLength(bucketName)) {
            throw new ServerException("桶名不能为");
        }
        minioClient.makeBucket(MakeBucketArgs.builder()
                .bucket(bucketName)
                .build());
    }
    /**
     * 创建文件夹
     *
     * @param bucketName 桶名
     * @param folderName 文件夹名称
     * @return
     * @throws Exception
     */
    public ObjectWriteResponse createBucketFolder(String bucketName, String folderName) throws Exception {
        if (!checkBucketExist(bucketName)) {
            throw new ServerException("桶不存在,无法创建文件夹");
        }
        if (!StringUtils.hasLength(folderName)) {
            throw new RuntimeException("创建的文件夹名不能为空");
        }
        PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                .bucket(bucketName)
                .object(folderName + "/")
                .stream(new ByteArrayInputStream(new byte[0]), 0, 0)
                .build();
        ObjectWriteResponse objectWriteResponse = minioClient.putObject(putObjectArgs);
        return objectWriteResponse;
    }
    /**
     * 检查桶是否存在
     *
     * @param bucketName 桶名称
     * @return boolean true-存在 false-不存在
     */
    public boolean checkBucketExist(String bucketName) throws Exception {
        if (!StringUtils.hasLength(bucketName)) {
            throw new ServerException("桶名不能为空");
        }
        return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
    }
    /**
     * 删除文件
     *
     * @param bucketName 桶名 
     * @param objectName 文件所在的路径 + 文件名称  例如100000/im/750510573649620992.xlsx
     * @return
     */
    public Boolean deleteBucketFile(String bucketName, String objectName) {
        if (!StringUtils.hasLength(bucketName) || !StringUtils.hasLength(objectName)) {
            throw new ServerException("桶名或文件名不能为空");
        }
        try {
            minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build());
            return true;
        } catch (Exception e) {
            log.info("删除文件失败");
            return false;
        }
    }
}

总结

以上则为简单的MinIO使用案例,其还有更多强大的功能,还包括数据加密、访问控制、版本管理等功能。官方提供的 SDK非常全面 官方文档 ,可以很轻松地在应用中完成整合。总之MinIO是一个非常强大的且可靠对象存储系统,值得信赖和推广。


    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]