从sftp服务器下载文件到本地(工具类)

import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import java.util.Vector; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; import com.jcraft.jsch.SftpException; /** * 类说明 sftp工具类 */ public class SftpUtil { private transient Logger log = LoggerFactory.getLogger(this.getClass()); private ChannelSftp sftp; private Session session; /** SFTP 登录用户名 */ private String username; /** SFTP 登录密码 */ private String password; /** 私钥 */ private String privateKey; /** SFTP 服务器地址IP地址 */ private String host; /** SFTP 端口 */ private int port; /** * 构造基于密码认证的sftp对象 */ public SftpUtil(String username, String password, String host, int port) { this.username = username; this.password = password; this.host = host; this.port = port; } /** * 构造基于秘钥认证的sftp对象 */ public SftpUtil(String username, String host, int port, String privateKey) { this.username = username; this.host = host; this.port = port; this.privateKey = privateKey; } public SftpUtil() { } /** * 连接sftp服务器 */ public void login() { log.info("开始登录sftp服务器。。。。"); try { JSch jsch = new JSch(); if (privateKey != null) { jsch.addIdentity(privateKey);// 设置私钥 } session = jsch.getSession(username, host, port); if (password != null) { session.setPassword(password); } Properties config = new Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); session.connect(); Channel channel = session.openChannel("sftp"); channel.connect(); sftp = (ChannelSftp) channel; } catch (JSchException e) { log.info("开始登录sftp服务器。。。。失败" + e.getMessage()); e.printStackTrace(); } log.info("登录sftp服务器。。。。成功"); } /** * 关闭连接 server */ public void logout() { if (sftp != null) { if (sftp.isConnected()) { sftp.disconnect(); } } if (session != null) { if (session.isConnected()) { session.disconnect(); } } } /** * 将输入流的数据上传到sftp作为文件。文件完整路径=basePath+directory * * @param basePath * 服务器的基础路径 * @param directory * 上传到该目录 * @param sftpFileName * sftp端文件名 * @param in * 输入流 */ public void upload(String basePath, String directory, String sftpFileName, InputStream input) throws SftpException { try { sftp.cd(basePath); sftp.cd(directory); } catch (SftpException e) { // 目录不存在,则创建文件夹 String[] dirs = directory.split("/"); String tempPath = basePath; for (String dir : dirs) { if (null == dir || "".equals(dir)) continue; tempPath += "/" + dir; try { sftp.cd(tempPath); } catch (SftpException ex) { sftp.mkdir(tempPath); sftp.cd(tempPath); } } } sftp.put(input, sftpFileName); // 上传文件 } /** * 下载文件。 * * @param directory * 下载目录 * @param downloadFile * 下载的文件 * @param saveFile * 存在本地的路径 */ public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException { log.info("directory===" + directory + ",downloadFile=" + downloadFile + ",saveFile=" + saveFile); if (directory != null && !"".equals(directory)) { sftp.cd(directory); } File file = new File(saveFile + downloadFile); // sftp.get(directory+downloadFile, saveFile+downloadFile); sftp.get(downloadFile, saveFile + downloadFile); // sftp.get(downloadFile, new FileOutputStream(file)); } /** * 下载文件 * * @param directory * 下载目录 * @param downloadFile * 下载的文件名 * @return 字节数组 */ public byte[] download(String directory, String downloadFile) throws SftpException, IOException { if (directory != null && !"".equals(directory)) { sftp.cd(directory); } InputStream is = sftp.get(downloadFile); byte[] fileData = IOUtils.toByteArray(is); return fileData; } /** * 删除文件 * * @param directory * 要删除文件所在目录 * @param deleteFile * 要删除的文件 */ public void delete(String directory, String deleteFile) throws SftpException { // sftp.cd(directory); sftp.rm(deleteFile); } /** * 列出目录下的文件 * * @param directory * 要列出的目录 * @param sftp */ public Vector<?> listFiles(String directory) throws SftpException { // System.out.println("directory=="+directory); sftp.cd(directory); return sftp.ls(directory); } // 上传文件测试 public static void main(String[] args) throws SftpException, IOException { SftpUtil sftp = new SftpUtil("用户名", "密码", "ip地址", 22); sftp.login(); File file = new File("D:\\图片\\t0124dd095ceb042322.jpg"); InputStream is = new FileInputStream(file); sftp.upload("基础路径", "文件路径", "test_sftp.jpg", is); sftp.logout(); } }
使用时需引入依赖的jar包jsch
相关代码

#远程系统服务器地址id
ftp.dt.service.addr=127.0.0.1
#远程ftp服务器目录,即文件所在目录
ftp.dt.service.ftpPath=/txt
#远程ftp服务器连接 端口
ftp.dt.service.port=33
#服务器登录名
ftp.dt.service.name=Administrator
#登录密码
ftp.dt.service.pwd=xxx
#本地存放文件的目录
ftp.dt.service.localPath=E://xx//
#dt文件的编码方式
ftp.dt.service.encoding=gb2312

public void initDtData(fhycgz e) { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd"); String thatDate = sdf.format(e.getRq()); String dirPath = fhycgzController.class.getClassLoader().getResource("/").getPath() + File.separator + "conf"; logger.info("根路径.....dirPaht="+dirPath); //home/gzrep/tomcat7/webapps/fdbs/WEB-INF/classes//conf Properties p = new Properties(); Boolean downFile = false; try { //logger.info("开始,获取xx数据 ....."+sdf.format(e.getRq())); p.load(new FileInputStream(dirPath + File.separator + "ebos-app.properties")); String host = p.getProperty("ftp.dt.service.addr"); String ftpPath = p.getProperty("ftp.dt.service.ftpPath"); String username = p.getProperty("ftp.dt.service.name"); String password = p.getProperty("ftp.dt.service.pwd"); String localPath = p.getProperty("ftp.dt.service.localPath"); String encode = p.getProperty("ftp.dt.service.encoding"); String port = p.getProperty("ftp.dt.service.port"); logger.info("ftpPath.....="+ftpPath); logger.info("localPath.....localPath="+localPath); downFile = isSuccessDownload(username, password, host, Integer.parseInt(port), ftpPath, localPath, thatDate); //if(downFile){ // initLocalData(e, sdf2, thatDate, localPath,encode); //} } catch (Exception e1) { e1.printStackTrace(); logger.info("初始化失败 ftp服务器连接异常--->=" + e1.getMessage()); } } public Boolean isSuccessDownload(String username, String password, String host, int port,String ftpPath,String localPath,String thatDate) { logger.info("开始从 xx ftp下载....."); Boolean res = false; SftpUtil sftp = new SftpUtil(username, password, host, port); try { sftp.login(); Vector<LsEntry> listFiles = (Vector<LsEntry>) sftp.listFiles(ftpPath); logger.info("-->xx ftp 目录中文件数...."+listFiles.size()); logger.info("-->开始遍历 xx 目录 中文件...."); for(LsEntry s:listFiles){ String fn = s.getFilename(); // logger.info("-->开始遍历 xx 目录 中文件...."+fn); if (fn.contains(thatDate)) { if(fn.lastIndexOf(".DT~")!=-1||fn.lastIndexOf(".DT")!=-1){ // logger.info("-->>找到包含"+thatDate+"的xx文件-----" + fn); res = true; File localFile = new File(localPath + File.separator + fn); // 判断本地文件存在就不用在下载了 if(localFile.exists()){ logger.info("-->>文件:" + fn + " 本地已存在,无须下载" ); }else{ long start = System.currentTimeMillis(); logger.info("-->>下载文件:" + fn + "开始:" + start); sftp.download(ftpPath, fn, localPath); long end = System.currentTimeMillis(); logger.info("-->>下载文件:" + fn + "结束:" + end+",用时"+(end-start)/1000+"秒"); } } } } if(!res){ logger.info("-->xx中没找到当天的文件...."+thatDate); } sftp.logout(); logger.info("-->遍历 xx目录 中文件....结束"); } catch (Exception e) { e.printStackTrace(); sftp.logout(); res = false; new Exception("从服务器下载文件过程中发生错误"+e.getMessage()); logger.info("-->从服务器下载文件过程中发生错误--"+e.getMessage()); } logger.info("结束从 xx ftp下载 ....."); return res; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理