用sftp上传文件至linux服务器

时间:2021-11-22 02:33:27

1.项目环境

框架:springmvc
    项目管理工具:maven

2.必须使用的jar

   com.jcraft
jsch
0.1.27
test

3.新建一个FileUpDown工具类,在类中添加以下属性

 //linux服务器基本连接参数
String host = "";//ip
String username = "";//用户名
String password = "";//密码
int port = 22; ChannelSftp sftp = null;
String remotePath = "/usr/java/file/img/";//服务器上的目标路径
String path;//实际路径

以上属性可以定义为private,可将相关属性值写入*.properties文件,然后读取.

4.连接服务器并获得ChannelSftp

 //连接服务器 获得ChannelSftp
public ChannelSftp getSftp() {
try {
JSch jsch = new JSch();
Session session = jsch.getSession(username, host, port);
session.setPassword(password);
Properties properties = new Properties();
properties.put("StrictHostKeyChecking", "no");
session.setConfig(properties);
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
sftp = (ChannelSftp) channel;
System.out.println("连接成功");
} catch (Exception e) {
System.out.println("连接失败");
e.printStackTrace();
}
return sftp;
}

5.上传文件

 //上传文件
public String upLoad(MultipartFile file){
...
}

现在上传的是单个文件,如果上传多个文件时可传入List,MultipartFile是spring提供的类型.
    在方法中写上以下代码:

 //上传文件
public String upLoad(MultipartFile file) throws IOException, SftpException {
InputStream is =null;
try{
//要上传的文件名
String filename = file.getOriginalFilename();
String suffix = filename.substring(filename.lastIndexOf("."));
//自动生成文件名
String autofilename = UUID.randomUUID().toString();
//生成路径加文件名
String path = remotePath + autofilename + suffix;
//得到文件输入流
is = file.getInputStream();
this.getSftp().put(is, path);
}finally {
//1.关闭输入流
//2.断开连接
...
}
return path;
}

6.断开服务

 public void close() {
if (this.sftp != null) {
if (this.sftp.isConnected()) {
this.sftp.disconnect();
} else if (this.sftp.isClosed()) {
System.out.println("断开服务成功");
}
}
}