springboot集成minIO
文件系统:负责管理和存储文件的系统软件。操作系统通过文件系统提供的接口去存取文件,用户通过操作系统访问磁盘上的文件
minIO:轻量级服务分布式文件系统,适合存储非机构化数据。采用去中心化共享架构,结点之间是对等关系。
端口号为9000,初次登录账号密码都是minioadmin
minIO中使用bucket的概念来分隔管理文件,当然我们也可以在设置object的时候通过2024/7/3/myPic.jpg在bucket中生成对应的文件夹方便文件管理
以下是通过minIO实现的文件管理
这里使用的是很经典的建造者模式,bucket代表你所选择的桶,object代表你要存放在当前桶的具体名称/具体位置,filename则是你要存放在文件在当前磁盘的具体位置。
public class MinIOtest { MinioClient minioClient = MinioClient.builder() .endpoint("http://192.168.101.65:9000") .credentials("minioadmin", "minioadmin") .build(); @Test public void upload() { try { minioClient.uploadObject( UploadObjectArgs.builder() .bucket("test") .object("pic.jpg") .filename("C:\\Users\\17900\\Pictures\\74721741_p0_master1200.jpg") .build() ); } catch (Exception e) { e.printStackTrace(); } } @Test public void delete() { try { minioClient.removeObject( RemoveObjectArgs.builder() .bucket("test") .object("pic.jpg") .build()); } catch (Exception e) { e.printStackTrace(); } } @Test public void search() { try { FilterInputStream test = minioClient.getObject( GetObjectArgs.builder() .bucket("test") .object("pic.jpg") .build() ); // 指定输出流输出 FileOutputStream fileOutputStream = new FileOutputStream(new File("C:\\Users\\17900\\Pictures\\74721741_p0_master1200.jpg")); IOUtils.copy(test, fileOutputStream); } catch (Exception e) { e.printStackTrace(); } } }
当我们使用springboot接受一个MultipartFile文件时,苦于无法直接传递他的绝对路径以便于后面filename的使用。
我们通过File.createTempFile()来生成一个临时文件,再将上述MultipartFile文件通过transferTo将文件内容传给这个临时文件。这时我们可以把这个临时文件上传给远程minIO以供保存,
下述示例中,我们可以通过absolutePath将文件传递给fileName从而实现图片远程保存。
@ApiOperation("上传文件接口") @RequestMapping(value = "/upload/coursefile",consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public UploadFileResultDto uploadCoursefile(@RequestPart("filedata")MultipartFile filedata) throws IOException { File tempFile=File.createTempFile("minio", "temp"); filedata.transferTo(tempFile); String absolutePath = tempFile.getAbsolutePath(); return mediaFileService.upload(filedata,absolutePath); }
24/7/5新增:通过minIO实现对分块文件的合并
@Test void merge() { List<ComposeSource> composeSources = Stream.iterate(0, i -> ++i) .limit(5) .map(i -> ComposeSource.builder().bucket("test").object("chunk/" + i).build()) .collect(Collectors.toList()); try { minioClient.composeObject(ComposeObjectArgs.builder() .bucket("test") .object("merge.mp4") .sources(composeSources) .build()); } catch (Exception e) { } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~