之前用的一个类在连接时报错:不支持该种连接方式。所以换了一个类,如下:
<!-- 链接ftp-->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.53</version>
</dependency>
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jzlib</artifactId>
<version>1.1.3</version>
</dependency>
主要时jsch类,下面的jzlib是使用它需要的jar包。
整个上传工具类如下:
public class FtpClientUtils {
private static ChannelSftp sftp;
/**
* 上传文件到sftp服务器
* @param host 服务器的地址
* @param port 端口
* @param username 用户名
* @param password 密码
* @param target_path 目标路径,即最后上传到服务器哪里
* @param local_path 本地路径,即原始文件所在目录
* @param filename 文件名---我是没改动文件名,需要改名的话可以加一个参数
*/
public static void uploadFile(String host, int port, String username, String password, String target_path, String local_path, String filename){
JSch jSch = new JSch();
try {
Session sshSession = jSch.getSession(username,host,port);
sshSession.setPassword(password);
Properties sshConfig = new Properties();
sshConfig.put("StrictHostKeyChecking", "no");
sshSession.setConfig(sshConfig);
sshSession.connect();
Channel channel = sshSession.openChannel("sftp");
channel.connect();
sftp = (ChannelSftp) channel;
} catch (JSchException e) {
e.printStackTrace();
}
File file = null;
try {
sftp.cd(target_path);
file = new File(local_path + filename);// 此处filename为服务器上该文件的名字,可自行更改
sftp.put(new FileInputStream(file), filename);
} catch (Exception e) {
e.printStackTrace();
}
}
}
一个小坑,和连接sftp无关:按照习惯,host,port什么的都是放在配置文件中的。结果在读取后使用@Value赋值后,运行总是报错。后来才发现:第一 host等属性不要设为static的 第二 在配置文件中不要用“username=xxx”这个名称,改为别的,如:“user_name=xxx”。否则会发现赋值的username并不是xxx,而是"电脑的名字"。
题外话:结合这个连接服务器的功能就可以生成本地文件后,自动上传服务器。如果是每日都需要这样的操作,可以做一个定时任务:定时把需要的数据生成文件,定时把该文件上传。没错,这就是我们的业务需求。
LG