批量处理远程共享目录中的特定类型文件(如 .hex、.csv 等)。

技术选型

组件说明
协议SMBv2 / SMBv3(推荐,安全性更高)
Java 库jcifs-ng(JCIFS 的活跃维护分支,支持现代 SMB 协议)
认证方式NTLM(Windows 域或本地账户)
开发语言Java 8+

1.2前提条件

✅ 前提条件(必须满足)

在目标服务器173.16.1.152上:

  1. 已共享D:\jenkins文件夹(这里改成你需要访问的共享目录
    • 共享名建议为jenkins→ 访问路径:\\173.16.1.152\jenkins目录名称改成自己相应即可
  2. 你有一个有写权限的 Windows 账户(如admin/deploy
  3. 防火墙允许 445 端口(默认 SMB 端口)
  4. “密码保护的共享”已关闭(或你知道正确凭据)

💡 测试:在winds服务器上按Win+R,输入
\\173.16.1.152\jenkins
看是否能打开并写入文件。

2、代码实现

代码执行流程示意图:

2.1、添加依赖

<dependency> <groupId>eu.agno3.jcifs</groupId> <artifactId>jcifs-ng</artifactId> <version>2.1.9</version> <!-- 请使用最新稳定版 --> </dependency>

2.2 提供接口核心代码

这部分主要是提供接口,和有些参数校验

@ApiOperation("只下载目录下的 .hex 文件并下载") @PostMapping("/getJenkinsHexData") public R<String> downloadSmbHexFiles(@RequestBody SmbDownloadRequestVo request) { // 1. 路径安全检查(防止路径遍历) if (request.getLocalBaseDir() != null && (request.getLocalBaseDir().contains("..") || request.getLocalBaseDir().contains("/"))) { throw new UserException("无效的本地基础目录路径"); } // // 2. 从环境变量获取密码(生产环境必须) // String safePassword = System.getenv("SMB_PASSWORD"); // if (safePassword == null) { // throw new UserException("未设置SMB_PASSWORD环境变量"); // } // 3. 验证请求参数 if (request.getSmbHost() == null || request.getShareName() == null || request.getUsername() == null) { throw new UserException("缺少必需参数:smbHost、shareName、username"); } try { // 4. 使用安全密码执行下载 WindowsDownloaderHexFile.downloadHexFiles( request.getSmbHost(), request.getShareName(), request.getRemotePath(), request.getUsername(), request.getPassword(), request.getLocalBaseDir(), true, request.getFileExtension() ); return R.ok("文件下载成功"); } catch (Exception e) { return R.fail("文件下载失败"); }