当前位置: 首页 > ds >正文

Java 实现下载指定minio目录下的所有内容到远程机器

需要把minio中,指定目录下的所有文件内容,保存到远程主机中指定位置,具体实现如下:

1、添加依赖

确保项目中引入了 MinIO 的 Java SDK和远程来进行 SSH 文件上传。

    <!-- MinIO SDK --><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.3</version></dependency><!-- JSch for SSH/SFTP --><dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version></dependency>

2、实现方法

/*** 上传到远程主机** @param bucketName  存储桶名称* @param prefix      前缀* @param remoteHost  远程主机* @param username    用户名* @param password    密码* @param remoteDir   远程目录* @param minioClient Minio 客户端* @return {@link List }<{@link String }>*/public List<String> uploadToRemote(String bucketName, String prefix, String remoteHost, String username, String password, String remoteDir, MinioClient minioClient) throws Exception {// 连接远程主机JSch jsch = new JSch();Session session = jsch.getSession(username, remoteHost, 22);session.setPassword(password);Properties config = new Properties();config.put("StrictHostKeyChecking", "no");session.setConfig(config);session.connect();ChannelSftp sftp = (ChannelSftp) session.openChannel("sftp");sftp.connect();// 确保目录存在ensureRemoteDirectory(sftp, remoteDir);Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).prefix(prefix).recursive(true).build());// 返回记录List<String> resInfo = new ArrayList<>();for (Result<Item> result : results) {Item item = result.get();String objectName = item.objectName();if (item.isDir()) continue;String relativePath = objectName.substring(prefix.length());String remoteFilePath = remoteDir + "/" + relativePath.replaceAll("^/+", "");// 创建远程子目录ensureRemoteDirectory(sftp, remoteFilePath.substring(0, remoteFilePath.lastIndexOf('/')));try (InputStream stream = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build())) {sftp.put(stream, remoteFilePath);resInfo.add(remoteFilePath);log.info("Uploaded: {} -> {}", objectName, remoteFilePath);}}sftp.disconnect();session.disconnect();return resInfo;}/*** 确保远程目录** @param sftp       SFTP* @param remotePath 远程路径* @throws Exception 例外*/private void ensureRemoteDirectory(ChannelSftp sftp, String remotePath) throws Exception {String[] folders = remotePath.split("/");String current = "";for (String folder : folders) {if (folder.isEmpty()) continue;current += "/" + folder;try {sftp.cd(current);} catch (Exception e) {sftp.mkdir(current);}}}

3、接口调用

 /*** 保存到远程计算机目录** @param bucketName 存储桶名称 minio-data* @param remotePath minio目录路径 model-file-path/data/28588882828181888/* @return {@link ResponseEntity }<{@link ? }>*/@PostMapping("/saveToRemoteMachineDirectory")public ResponseEntity<?> saveToRemoteMachineDirectory(@RequestParam String bucketName, @RequestParam String remotePath) {try {// 初始化 MinIO 客户端MinioClient minioClient = MinioClient.builder().endpoint(minioConfig.getEndpoint()).credentials(minioConfig.getAccessKey(), minioConfig.getSecretKey()).build();// 使用 substring 和 lastIndexOf 方法提取 remotePath 中最后一级目录int lastSlashIndex = remotePath.lastIndexOf("/");int secondLastSlashIndex = remotePath.lastIndexOf("/", lastSlashIndex - 1);String lastLevelContents = remotePath.substring(secondLastSlashIndex + 1, lastSlashIndex);// 远程保存路径String remoteDir = "/home/data/temp/" + lastLevelContents;// 调用方法List<String> result = uploadToRemote(bucketName, remotePath, "192.168.10.88", "root", "123456", remoteDir, minioClient);// 返回内容return ResponseEntity.ok(Map.of("code", 200,"data", result,"msg", "下载完成"));} catch (Exception e) {return ResponseEntity.status(500).body(Map.of("code", 500,"msg", "下载失败","error", e.getMessage()));}}

至此,即可实现下载minio中指定目录下的所有文件内容到远程指定的机器了。

上传本机的可参考:Java 实现下载指定minio目录下的所有内容到本机-CSDN博客

http://www.xdnf.cn/news/9888.html

相关文章:

  • ssm学习笔记(尚硅谷) day1
  • 生成式人工智能:重构软件开发的范式革命与未来生态
  • 预处理,咕咕咕
  • Cesium 展示——获取鼠标移动、点击位置的几种方法
  • 第四章、自平衡控制
  • 【Ubuntu远程桌面】
  • .NET WinForm图像识别二维码/条形码
  • 从零开始的数据结构教程(六) 贪心算法
  • 超声波换能器 换能原理
  • 「卫星百科」“绿色守卫”高分六号
  • MVCC 原理与并发控制实现
  • 【Pandas】pandas DataFrame equals
  • STP配置
  • 基于Java,SpringBoot,Vue,UniAPP医院预约挂号买药就诊病例微信小程序系统设计
  • 代码随想录打卡|Day50 图论(拓扑排序精讲 、dijkstra(朴素版)精讲 )
  • Java中如何枚举正则表达式捕获组的名字
  • RabbitMQ项目实战
  • 【机器学习基础】机器学习入门核心算法:随机森林(Random Forest)
  • 华为OD机试真题——AI面板识别(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • 高效开发,升级软件,硬件也要专业
  • 大数据治理体系构建与实践路径
  • MYSQL 使用心得
  • SIEMENS西门子6FC特价系列型号6FC5303-1AF02-8BP0
  • AI问答-Vue3+TS:reactive创建一个响应式数组,用一个新的数组对象来替换它,同时保持响应性
  • Java中的设计模式实战:单例、工厂、策略模式的最佳实践
  • NumPy 2.x 完全指南【二十二】数组标量
  • Socket网络编程
  • Vue3 + Element Plus 实现树形结构的“单选 + 只选叶子节点 + 默认选中第一个子节点”
  • 微内核与宏内核有什么区别(GAI)
  • laya3的2d相机与2d区域