SpringBoot集成Minio实现文件上传
目录
创建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; }
测试结果
ok ok ok
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。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!