在Java中操作SFTP(SSH File Transfer Protocol)进行文件的上传和下载,通常我们会使用一些第三方库,因为Java标准库(JDK)本身并不直接支持SFTP。常用的库有JSch(Java Secure Channel),它提供了对SSH2的完整支持,包括SFTP。
下面是一个使用JSch库进行SFTP文件上传和下载的简单示例。
1. 添加JSch依赖
首先,你需要在你的项目中添加JSch的依赖。如果你使用Maven,可以在pom.xml
中添加如下依赖:
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
2. SFTP文件上传
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
public class SFTPUpload {
public static void uploadFile(String host, int port, String user, String password, String localFile, String remoteFile) {
try {
JSch jsch = new JSch();
Session session = jsch.getSession(user, host, port);
session.setPassword(password);
// 避免第一次连接时询问yes/no
session.setConfig("StrictHostKeyChecking", "no");
System.out.println("Establishing Connection...");
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp channelSftp = (ChannelSftp) channel;
channelSftp.put(localFile, remoteFile);
channelSftp.exit();
session.disconnect();
System.out.println("File uploaded successfully to " + remoteFile);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
uploadFile("sftp.example.com", 22, "username", "password", "/path/to/local/file.txt", "/path/to/remote/file.txt");
}
}
3. SFTP文件下载
public class SFTPDownload {
public static void downloadFile(String host, int port, String user, String password, String remoteFile, String localFile) {
try {
JSch jsch = new JSch();
Session session = jsch.getSession(user, host, port);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp channelSftp = (ChannelSftp) channel;
channelSftp.get(remoteFile, localFile);
channelSftp.exit();
session.disconnect();
System.out.println("File downloaded successfully to " + localFile);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
downloadFile("sftp.example.com", 22, "username", "password", "/path/to/remote/file.txt", "/path/to/local/file.txt");
}
}
注意事项
- 在生产环境中,应避免使用
"StrictHostKeyChecking", "no"
,因为这会使你的应用容易受到中间人攻击。相反,你应该在第一次连接时验证服务器的公钥,并将其保存在你的应用中。 - 确保处理所有可能的异常,比如网络问题、认证失败等。
- 对于大文件的上传和下载,可能需要考虑性能优化,比如使用流来分块处理文件。
- 如果SFTP服务器配置了特定的密钥文件而非密码,你还需要使用
session.addIdentity(privateKeyFile);
来添加私钥。