sftp简介
sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。sftp 与 ftp 有着几乎一样的语法和功能。SFTP 为 SSH的其中一部分,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File Transfer Protocol)的安全文件信息传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接和答复操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。
添加依赖
<dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.54</version> </dependency>
增加配置
sftp: ip: 192.168.1.60 port: 22 timeout: 60000 retryTime: 3 admin: username: admin password: 2k3xrYjbd930.
代码示例
每天凌晨1点在多个用户目录中下载csv文件至本地tmp目录
@Service public class SftpTask extends Thread { private ChannelSftp sftp; private Session session; @Value("${sftp.admin.username}") private String username; @Value("${sftp.admin.password}") private String password; @Value("${sftp.host}") private String host; @Value("${sftp.port}") private Integer port; private SftpService sftpService; public EtlSftpTask (SftpService sftpService) { this.sftpService = sftpService; } /** * 建立sftp连接 */ private void connect(){ try { JSch jSch = new JSch(); session = jSch.getSession(username, host, port); session.setPassword(password); session.setConfig("StrictHostKeyChecking", "no"); session.connect(); Channel channel = session.openChannel("sftp"); channel.connect(); sftp = (ChannelSftp) channel; }catch (JSchException e) { e.printStackTrace(); } } /** * 关闭sftp连接 */ public void close(){ try { if (sftp != null) { if (sftp.isConnected()) sftp.disconnect(); } if(session != null){ if (session.isConnected()) session.disconnect(); } } catch (Exception e) { e.printStackTrace(); } } /** * 下载文件到本地 * * @param source 源文件 * @param target 目标文件 * @throws SftpException 异常 * @throws FileNotFoundException 异常 */ private void download(String source, String target) throws SftpException, FileNotFoundException { sftp.get(source, new FileOutputStream(new File(target))); } /** * 处理用户数据文件 * * @param root 数据文件根目录 * @param lastTime 上次处理文件的最后的时间 * @return 本次处理文件的最后的时间 */ private Integer handle(String root, Integer lastTime) { String directory = root + "/event/"; Vector files; try { files = sftp.ls(directory + "event_*.csv"); } catch (Exception e) { e.printStackTrace(); return 0; } // 文件名 String fileName; // 临时文件 String tmpFile; // 文件更新时间 Integer mTime; // 文件最后更新时间 Integer maxTime = lastTime; // 处理用户文件 for(Object o: files) { try { ChannelSftp.LsEntry f = (ChannelSftp.LsEntry) o; // 文件更新时间 mTime = f.getAttrs().getMTime(); if (mTime <= lastTime) continue; // 文件名 fileName = f.getFilename(); // 最后处理事件 maxTime = Math.max(maxTime, mTime); // 下载文件 tmpFile = "/tmp/" + fileName; download(directory + fileName, tmpFile); } catch (Exception e) { // TODO 错误日志 e.printStackTrace(); } } // 返回文件最后的处理时间 return maxTime; } /** * 每天凌晨1点开始执行 */ @Scheduled(cron = "0 0 1 * * *") public void task () { // 获取sftp连接 connect(); String root; Integer lastTime; Long cid; Integer maxTime = lastTime; // 获取用户列表 for (SftpDTO sftpDTO: sftpService.findAll()) { // 用户主目录 root = sftpDTO.getSftpRoot(); // 上次处理文件的最后时间 lastTime = sftpDTO.getLastTime(); maxTime = Math.max(maxTime, handle(root, lastTime)); // 更新最后处理时间 if (!maxTime.equals(lastTime)) { sftpDTO.setLastTime(maxTime); sftpService.update(sftpDTO); } } // 释放sftp资源 close(); } }
总结
以上所述是小编给大家介绍的Java使用sftp定时下载文件的示例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!