SpringBoot+Hutool的SFTP文件上传到服务器

准备好Liunx服务器(虚拟机)

我这里使用VMware 虚拟机
虚拟机配置可参考 https://blog.csdn.net/user_admin_god/article/details/143085598?spm=1001.2014.3001.5501

在这里插入图片描述

Maven依赖加入Hutool-all

在这里插入图片描述

SFTP是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。
SFTP 为 SSH的一部份,是一种传输文件到服务器的安全方式。SFTP是使用加密传输认证信息和数据,所以,使用SFTP是非常安全的。
但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。

#使用


 <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.26</version>
        </dependency>
        <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.53</version>
        </dependency>
        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.11.1</version>
        </dependency>
        <dependency>

文件通过STFP写入到服务器/tmp/upload目录

web项目
文件上传接口接收前端传入的文件
文件写入到服务所在设备目录
然后SFTP工具读取文件写到服务器对应目录

@RestController
@RequestMapping("sftp")
@Tag(name = "sftp")
@Slf4j
public class SFTPController {


    @PostMapping("/save")
    public Resp<String> insertBatch(@RequestPart("file") MultipartFile file, HttpServletRequest request) {
        String originalFilename = file.getOriginalFilename();
        String filePathLocal = "/temp/upload/" + originalFilename;
        try {
            String os = System.getProperty("os.name");
            if (os.toLowerCase().startsWith("win")) {
                filePathLocal = "G:/temp/upload/" + originalFilename;
            }
            // 文件附件保存到本地
            InputStream inputStream = file.getInputStream();
            FileCopyUtils.copy(inputStream, new FileOutputStream(filePathLocal));
            // 连接SFTP
            Sftp sftp = JschUtil.createSftp("192.168.11.44", 22, "root", "123456");
            //进入远程目录
            String remotePath = "/tmp/upload";
            if (!sftp.exist(remotePath)) {
                sftp.mkdir(remotePath);
            }
            sftp.cd(remotePath);
            //上传本地文件
            sftp.put(filePathLocal, remotePath);
            sftp.close();
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        return Resp.Ok();
    }

}

通过Knife4j-v4.1.0接口测试

在这里插入图片描述

然后去服务器查看对应目录是否写上去了

在这里插入图片描述

Hutool的SFTP文件下载

  @PostMapping("/get")
    public Resp<String> insertBatch(@RequestParam("name") String name, HttpServletRequest request) {
        String remotePath = "/tmp/upload/" + name;
        // 本地存放文件地址
        String filePathLocal = "G:/temp/upload/" + name;
        try {
            // 连接SFTP
            Sftp sftp = JschUtil.createSftp("192.168.11.44", 22, "root", "123456");
            //获取远程服务器文件放入本地文件
            sftp.get(remotePath, filePathLocal);
            sftp.close();
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        return Resp.Ok();
    }

Knife4j-v4.1.0接口测试 SFTP获取文件

在这里插入图片描述
在这里插入图片描述

Ending

### Spring Boot 中实现 SFTP 文件上传及多服务器文件互传 #### 配置多个 SFTP 连接池 为了支持多个 SFTP 服务器间的文件传输,需定义不同 SFTP 服务器的连接属性。这可以通过在 `application.yml` 或者 `application.properties` 文件中指定不同的数据源来达成。 对于每一个要连接的 SFTP 服务器,可以按照如下格式配置: ```properties spring.sftp.servers[0].host=localhost spring.sftp.servers[0].port=22 spring.sftp.servers[0].user=root spring.sftp.servers[0].password=password ... ``` 上述配置允许应用程序识别并管理多个远程主机的信息[^1]。 #### 创建自定义 SFTP 工具类 构建一个通用的服务层组件用于处理与各个 SFTP 服务器交互的任务。此工具类应当能够接收目标服务器索引作为参数之一,从而决定具体操作哪个实例上的资源。 ```java @Service public class MultiSFtpService { @Value("${spring.sftp.servers}") private List<SFtpServer> sfTpservers; public void upload(String localFilePath, String remoteDirPath, int serverIndex){ SFtpServer target = sfTpservers.get(serverIndex); JSch jsch = new JSch(); Session session; Channel channel; try { session = jsch.getSession(target.getUser(), target.getHost(), Integer.parseInt(target.getPort())); session.setPassword(target.getPassword()); java.util.Properties config = new java.util.Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); session.connect(); channel = session.openChannel("sftp"); ((ChannelSftp)channel).cd(remoteDirPath); ((ChannelSftp)channel).put(localFilePath,remoteDirPath); channel.disconnect(); session.disconnect(); } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } } ``` 这段代码展示了如何基于给定的目标服务器索引来执行具体的上传动作[^3]。 #### 动态切换 SFTP 并实施跨服转移 当涉及到两个或更多个 SFTP 服务器之间的文件迁移时,则需要先从源位置下载文件到本地临时路径再重新上载至目的地;或者更高效的方式是在内存流里完成整个过程而无需落地保存副本。 这里给出一种简单的方法——利用前面提到过的 `MultiSFtpService` 类中的方法组合起来形成完整的流程控制逻辑: ```java @Transactional public boolean transferBetweenServers(int fromServerId, int toServerId, String filePathOnFromServer, String destFolderPathOnToServer){ File tempLocalFile = null; InputStream inputStream = null; OutputStream outputStream = null; try{ // 下载文件到本地缓存区 byte[] buffer = multiSFtpService.download(filePathOnFromServer,fromServerId); tempLocalFile = Files.createTempFile("temp-", ".tmp").toFile(); outputStream = new FileOutputStream(tempLocalFile); IOUtils.copy(new ByteArrayInputStream(buffer),outputStream); // 将文件传到另一个SFTP服务器 multiSFtpService.upload(tempLocalFile.getAbsolutePath(),destFolderPathOnToServer,toServerId); return true; }catch(Exception ex){ logger.error(ex.toString()); return false; }finally{ if(inputStream!=null){try{inputStream.close();}catch(IOException ignored){}} if(outputStream!=null){try{outputStream.close();}catch(IOException ignored){}} if(tempLocalFile!=null && !tempLocalFile.delete()){ logger.warn("Failed to delete temporary file."); } } } ``` 该函数实现了两步走策略:先是把来自第一个服务器的数据拉取下来暂存在本机,接着把这些内容推送到第二个远端节点上去[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值