网站首页 > java教程 正文
Java SFTP 上传、下载等操作
实际开发中用到了 SFTP
用于交换批量数据文件,然后琢磨了下这方面的东西,基于 JSch
写了个工具类记录下,便于日后使用。
JSch
是 SSH2
的纯Java实现。JSch
可以连接到sshd服务器并使用端口转发,X11转发,文件传输等,并且很方便的将其功能集成到Java程序中。
1、添加依赖
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
2、SFTPUtils 工具类
public class SFTPUtils {
private Logger log = LoggerFactory.getLogger(SFTPUtils.class);
private String host; // 主机名称/IP
private int port = 22; // 端口
private String username; // 用户名
private String password; // 密码
private ChannelSftp sftp = null;
private Channel channel = null;
private Session session = null;
public SFTPUtils(String host, String userName, String password) {
this.host = host;
this.username = userName;
this.password = password;
}
public SFTPUtils(String host, int port, String userName, String password) {
this.host = host;
this.port = port;
this.username = userName;
this.password = password;
}
/**
* 连接SFTP服务器
*
* @throws JSchException
*/
public void connect() throws JSchException {
JSch jSch = new JSch();
session = jSch.getSession(username, host, port);
session.setPassword(password);
session.setConfig(this.buildConfig());
session.connect();
channel = session.openChannel("sftp");
channel.connect();
sftp = (ChannelSftp) channel;
log.info("连接主机:{} 登录成功", host);
}
/**
* 构建连接配置参数
*
* @return Properties
*/
private Properties buildConfig() {
Properties properties = new Properties();
properties.put("StrictHostKeyChecking", "no");
return properties;
}
/**
* 关闭连接
*/
public void disconnect() {
try {
if (sftp.isConnected()) {
sftp.disconnect();
}
if (channel.isConnected()) {
channel.disconnect();
}
if (session.isConnected()) {
session.disconnect();
}
} catch (Throwable e) {
//ignore
}
}
/**
* 下载文件
*
* @param sftpPath 服务器路径,不指定路径默认是FTP的根路径,指定路径是指的SFTP的根路径下开始。
* 例如:SFTP根路径为:/sftp/file,那么默认下载文件会去根路径下载,而指定 sftpPath 也是从根路径下开始;
* 指定 sftpPath 为 word,那么是从 /sftp/file/word 路径中查找文件下载。为空表示忽略该参数。
* @param fileName 文件名
* @param toFilePath 下载保存文件路径,路径+文件名,例如:d:/test.txt
* @return
*/
public boolean downloadFile(String sftpPath, String fileName, String toFilePath) {
FileOutputStream fileOutputStream = null;
try {
if (StringUtils.isNotBlank(sftpPath)) {
sftp.cd(sftpPath);
}
fileOutputStream = new FileOutputStream(new File(toFilePath));
sftp.get(fileName, fileOutputStream);
return true;
} catch (Exception e) {
log.error("下载文件错误", e);
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
//ignore
}
}
}
return false;
}
/**
* 上传文件
*
* @param sftpPath 服务器路径,不指定路径默认是FTP的根路径,指定路径是指的SFTP的根路径下开始。
* 例如:SFTP根路径为:/sftp/file,那么默认下载文件会去根路径下载,而指定 sftpPath 也是从根路径下开始;
* 指定 sftpPath 为 word,那么是从 /sftp/file/word 路径中查找文件下载。为空表示忽略该参数。
* @param fileName 上传后文件名
* @param localFilePath 文件路径,路径+文件名,例如:d:/test.txt
* @return
*/
public boolean uploadFile(String sftpPath, String fileName, String localFilePath) {
FileInputStream inputStream = null;
try {
if (StringUtils.isNotBlank(sftpPath)) {
sftp.cd(sftpPath);
}
inputStream = new FileInputStream(new File(localFilePath));
sftp.put(inputStream, fileName);
return true;
} catch (Exception e) {
log.error("上传文件错误", e);
} finally {
if (null != inputStream) {
try {
inputStream.close();
} catch (IOException e) {
//ignore
}
}
}
return false;
}
/**
* 上传文件
*
* @param sftpPath 服务器路径,不指定路径默认是FTP的根路径,指定路径是指的SFTP的根路径下开始。
* 例如:SFTP根路径为:/sftp/file,那么默认下载文件会去根路径下载,而指定 sftpPath 也是从根路径下开始;
* 指定 sftpPath 为 word,那么是从 /sftp/file/word 路径中查找文件下载。为空表示忽略该参数。
* @param fileName 上传后文件名
* @param inputStream 文件输入流
* @return
*/
public boolean uploadFile(String sftpPath, String fileName, InputStream inputStream) {
try {
if (StringUtils.isNotBlank(sftpPath)) {
sftp.cd(sftpPath);
}
sftp.put(inputStream, fileName);
return true;
} catch (Exception e) {
log.error("上传文件错误", e);
} finally {
if (null != inputStream) {
try {
inputStream.close();
} catch (IOException e) {
//ignore
}
}
}
return false;
}
/**
* 删除文件
*
* @param sftpPath 服务器路径,不指定路径默认是FTP的根路径,指定路径是指的SFTP的根路径下开始。
* 例如:SFTP根路径为:/sftp/file,那么默认下载文件会去根路径下载,而指定 sftpPath 也是从根路径下开始;
* 指定 sftpPath 为 word,那么是从 /sftp/file/word 路径中查找文件下载。为空表示忽略该参数。
* @param fileName 文件名
* @return
*/
public boolean deleteFile(String sftpPath, String fileName) {
try {
if (StringUtils.isNotBlank(sftpPath)) {
sftp.cd(sftpPath);
}
sftp.rm(fileName);
return true;
} catch (Exception e) {
log.error("删除文件失败", e);
}
return false;
}
/**
* 查询指定目录下信息
*
* @param sftpPath 服务器路径,不指定路径默认是FTP的根路径,指定路径是指的SFTP的根路径下开始。
* 例如:SFTP根路径为:/sftp/file,那么默认下载文件会去根路径下载,而指定 sftpPath 也是从根路径下开始;
* 指定 sftpPath 为 word,那么是从 /sftp/file/word 路径中查找文件下载。为空表示忽略该参数。
* @return
*/
public List<String> listFiles(String sftpPath) throws SftpException {
Vector files = sftp.ls(sftpPath);
List<String> result = new ArrayList<String>();
Iterator iterator = files.iterator();
while (iterator.hasNext()) {
LsEntry isEntity = (LsEntry) iterator.next();
result.add(isEntity.getFilename());
}
return result;
}
}
在使用的的时候,需要调用 connect()
开启连接,使用完后调用 disconnect()
关闭连接 。
jsch
官方的文档说明 http://www.jcraft.com/jsch/
本文主要用于个人记录笔记!
猜你喜欢
- 2024-10-21 Spring WEB工程整合使用FTP,ftp文本文件解析入库,文件上传下载
- 2024-10-21 使用SFTP跟服务器传输文件(怎么用sftp上传文件到服务器)
- 2024-10-21 Ubuntu 下安装 JDK17(ubuntu中安装jdk)
- 2024-10-21 JasperReport生成pdf文件 Java开发pdf文件 pdf文件生成及下载
- 2024-10-21 用JavaEE实现前后台交互的文件上传与下载,适合小白入门练手!
- 2024-10-21 JAVA 大文件上传解决方案(500M以上)
- 2024-10-21 《数据结构与算法分析Java语言描述》PDF文件免费下载
- 2024-10-21 CDH安装系统环境准备——系统版本和安装包下载地址指南
- 2024-10-21 jar文件怎么打开(base.apk.1文件怎么打开)
- 2024-10-21 Java 实现 FastDFS 实现文件的上传、下载、删除
你 发表评论:
欢迎- 07-21如何将 iPhone 中的联系人导出到 Excel/CSV?
- 07-21sql查询的字段数据中有逗号。放到csv文件会分开,如何解决?
- 07-21在 WebAPI 里生成 csv zip 文件(webapi怎么发布在iis上)
- 07-21如何把csv格式转换成Excel格式(csv格式怎么转换)
- 07-21如何将高程导出为XYZ或CSV高程点(如何将高程数据导入cad)
- 07-21使用python把csv汇总成excel(python怎么将csv文件中的列存入列表)
- 07-21解决PHP导出CSV文件中文乱码问题(php导出excel文件)
- 07-21使用vba将Excel 文件转成 CSV 文件
- 最近发表
-
- 如何将 iPhone 中的联系人导出到 Excel/CSV?
- sql查询的字段数据中有逗号。放到csv文件会分开,如何解决?
- 在 WebAPI 里生成 csv zip 文件(webapi怎么发布在iis上)
- 如何把csv格式转换成Excel格式(csv格式怎么转换)
- 如何将高程导出为XYZ或CSV高程点(如何将高程数据导入cad)
- 使用python把csv汇总成excel(python怎么将csv文件中的列存入列表)
- 解决PHP导出CSV文件中文乱码问题(php导出excel文件)
- 使用vba将Excel 文件转成 CSV 文件
- python爬虫25 | 爬取的数据怎么保存?CSV了解一下
- MySQL 导出数据(mysql 导出数据 判断成功)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)