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

用sftp协议实现对文件的上传下载

  1. 添加依赖, 用后者而非前者,前者可能报错
        <dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version></dependency><dependency><groupId>com.github.mwiede</groupId><artifactId>jsch</artifactId><version>0.2.24</version></dependency>
  1. 工具类代码
import com.jcraft.jsch.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.File;
import java.io.FileInputStream;
import java.util.List;
import java.util.Properties;public class SFTPUtils {private static final Logger LOG = LoggerFactory.getLogger(SFTPUtils.class);/*** SFTP文件上传* @param host      SFTP服务器地址* @param port      SFTP端口* @param username  用户名* @param password  密码* @param localPath  本地文件路径* @param remoteDir 远程目录路径* @return true上传成功, false上传失败*/public static boolean uploadFile(String host, int port, String username, String password,String localPath, String remoteDir) {LOG.info(">>>>开始执行ftp上传文件,host={},port={},username={},password={},localPath={},remoteDir={}", host,port,username, password,localPath,remoteDir);ChannelSftp sftp = null;Session session = null;FileInputStream fis = null;try {// 1. 创建JSch对象JSch jsch = new JSch();// 2. 创建会话session = jsch.getSession(username, host, port);session.setPassword(password);// 3. 设置SSH配置Properties config = new Properties();config.put("StrictHostKeyChecking", "no"); // 跳过主机密钥检查session.setConfig(config);// 4. 连接会话session.connect();// 5. 打开SFTP通道Channel channel = session.openChannel("sftp");channel.connect();sftp = (ChannelSftp) channel;// 6. 确保远程目录存在try {sftp.cd(remoteDir);} catch (SftpException e) {// 目录不存在则递归创建mkdirs(sftp, remoteDir);}// 7. 上传文件File file = new File(localPath);fis = new FileInputStream(file);sftp.put(fis, file.getName());LOG.info("<<<结束执行ftp上传文件,上传成功,host={},port={},username={},password={},localPath={},remoteDir={}", host,port,username, password,localPath,remoteDir);return true;} catch (Exception e) {LOG.error("<<<结束执行ftp上传文件,上传失败,host={},port={},username={},password={},localPath={},remoteDir={}", host,port,username, password,localPath,remoteDir, e);return false;} finally {// 8. 关闭资源try {if (fis != null) fis.close();if (sftp != null) sftp.exit();if (session != null) session.disconnect();} catch (Exception e) {LOG.error("关闭ftp资源发生异常,host={},port={},username={},password={},localPath={},remoteDir={}", host,port,username, password,localPath,remoteDir, e);}}}/*** 递归创建目录*/private static void mkdirs(ChannelSftp sftp, String path) throws SftpException {String[] folders = path.split("/");for (String folder : folders) {if (folder.isEmpty()) continue;try {sftp.cd(folder);} catch (SftpException e) {sftp.mkdir(folder);sftp.cd(folder);}}}/*** SFTP文件下载* @param host      SFTP服务器地址* @param port      SFTP端口* @param username  用户名* @param password  密码* @param localDirectory  本地目录* @param remoteFilePaths 远程文件路径* @return 下载成功的文件数目*/public static int downloadFiles(String host, int port, String username, String password,String localDirectory, List<String> remoteFilePaths) {String remoteFilePathsStr = String.join(",", remoteFilePaths);LOG.info(">>>>开始执行ftp文件下载,host={},port={},username={},password={},localDirectory={},remoteFilePaths={}", host,port,username, password,localDirectory, remoteFilePathsStr);ChannelSftp sftp = null;Session session = null;int totalNum = remoteFilePaths.size();int count = 0;try {// 1. 创建JSch对象JSch jsch = new JSch();// 2. 创建会话session = jsch.getSession(username, host, port);session.setPassword(password);// 3. 设置SSH配置Properties config = new Properties();config.put("StrictHostKeyChecking", "no"); // 跳过主机密钥检查session.setConfig(config);// 4. 连接会话session.connect();// 5. 打开SFTP通道sftp = (ChannelSftp) session.openChannel("sftp");sftp.connect();File localDirectoryFile = new File(localDirectory);if (!localDirectoryFile.exists()) {localDirectoryFile.mkdirs();}//6. 执行文件的下载for (String remotePath : remoteFilePaths) {String fileName = getFileNameFromPath(remotePath);String localPath = localDirectory + File.separator + fileName;sftp.get(remotePath, localPath);count++;LOG.info("---执行ftp文件下载成功,host={},port={},remotePath={},localPath={},当前下载成功数目={}, 待下载数目={}", host,port, remotePath, localPath,count, totalNum-count);}}catch (Exception e){LOG.error("<<<<执行ftp文件下载过程中发生异常,host={},port={},username={},password={},localDirectory={},remoteFilePaths={}, 下载成功数目={}", host,port,username, password,localDirectory, remoteFilePathsStr, count, e);}finally {// 8. 关闭资源try {if (sftp != null){sftp.exit();}if (session != null){session.disconnect();}} catch (Exception e) {LOG.error("关闭ftp资源发生异常,host={},port={},username={},password={},localDirectory={},remoteFilePaths={}, 下载成功数目={}", host,port,username, password,localDirectory, remoteFilePathsStr, count, e);}}return count;}/*** 从路径中提取文件名*/private static String getFileNameFromPath(String path) {int lastSeparator = path.lastIndexOf('/');if (lastSeparator >= 0) {return path.substring(lastSeparator + 1);}return path;}
}
http://www.xdnf.cn/news/1343485.html

相关文章:

  • 高压、高功率时代,飞机电气系统如何保障安全?
  • PDF文档安全升级:三招实现文本转曲线(防篡改+高清输出)
  • 一分钟docker部署onlyoffice 在线预览word pdf excel...
  • 嵌入式第三十五天(网络编程)
  • week3-[二维数组]最大列
  • WindowsAPI|每天了解几个winAPI接口之网络配置相关文档Iphlpapi.h详细分析9
  • Windows应急响应一般思路(二)
  • 【基础算法】离散化
  • 驱动(二)uboot编译+内核编译+文件系统
  • AI 绘画争议背后:版权归属、艺术原创性与技术美学的三方博弈
  • 排序---插入排序
  • Oracle APEX 经典报表中的Checkbox
  • 使用EasyExcel自定义导出表格
  • 开发二手车小程序时,如何确保信息的真实性和可靠性?
  • C#:窗体间传值
  • 计数组合学7.20(平面分拆与RSK算法)
  • 亚矩阵云手机:亚马逊第三方店铺多账号安全合规运营的核心技术支撑
  • Matplotlib 可视化大师系列(六):plt.imshow() - 绘制矩阵与图像的强大工具
  • 2026年计算机毕设推荐:基于大数据的慢性肾病数据可视化分析系统技术选型指南【Hadoop、spark、python】
  • 决策树基础学习教育第一课:从概念到核心原理
  • 【Canvas与旗帜】美国星条旗玻璃光圆饼
  • Lua脚本如何执行主程序的C函数
  • ODYSSEY:开放世界四足机器人的探索与操控,助力长范围任务
  • Node.js 开发 JavaScript SDK 包的完整指南(AI)
  • 基于Node.js服务端的社区报修管理系统/基于express的在线报修管理系统
  • 数据工程师——ETL
  • FastText 词向量全景指南(没那么全)
  • 如何创建一个Cloudfalare worker项目?
  • vue-admin-template权限管理
  • 【python】os.makedirs和with open