在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);来添加私钥。