在 Java 中,您可以使用 JSch(Java Secure Channel)库 来连接和操作 SFTP 服务器。以下是一个完整的示例代码,展示如何使用 Java 接入 SFTP 服务器并上传文件。
2.加入SFTP 用户------(小白篇 2)
3.代码加入SFTP JAVA ---(小白篇3)
Maven 引入依赖
在您的 pom.xml
文件中添加 JSch 依赖:
xml
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
Java 示例代码
以下代码展示了如何连接 SFTP 服务器、上传文件、下载文件和列出目录内容:
java
import com.jcraft.jsch.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Vector;
public class SftpClient {
private static final String SFTP_HOST = "your-server-ip"; // 服务器地址
private static final int SFTP_PORT = 22; // 默认端口
private static final String SFTP_USER = "newuser"; // 用户名
private static final String SFTP_PASSWORD = "yourpassword"; // 密码
public static void main(String[] args) {
Session session = null;
ChannelSftp sftpChannel = null;
try {
// 1. 创建 JSch 对象
JSch jsch = new JSch();
// 2. 建立会话
session = jsch.getSession(SFTP_USER, SFTP_HOST, SFTP_PORT);
session.setPassword(SFTP_PASSWORD);
// 3. 配置 StrictHostKeyChecking
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
// 4. 连接服务器
session.connect();
System.out.println("Session connected.");
// 5. 打开 SFTP 通道
Channel channel = session.openChannel("sftp");
channel.connect();
System.out.println("SFTP channel connected.");
sftpChannel = (ChannelSftp) channel;
// 上传文件
String localFile = "C:/path/to/local/file.txt"; // 本地文件路径
String remoteDir = "/uploads/"; // 远程目录
uploadFile(sftpChannel, localFile, remoteDir);
// 下载文件
String remoteFile = "/uploads/file.txt"; // 远程文件路径
String downloadDir = "C:/path/to/download/"; // 本地下载目录
downloadFile(sftpChannel, remoteFile, downloadDir);
// 列出远程目录文件
listFiles(sftpChannel, remoteDir);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭连接
if (sftpChannel != null) {
sftpChannel.disconnect();
}
if (session != null) {
session.disconnect();
}
}
}
// 上传文件
private static void uploadFile(ChannelSftp sftpChannel, String localFile, String remoteDir) {
try (FileInputStream fis = new FileInputStream(localFile)) {
sftpChannel.put(fis, remoteDir + localFile.substring(localFile.lastIndexOf("/") + 1));
System.out.println("File uploaded successfully.");
} catch (Exception e) {
e.printStackTrace();
}
}
// 下载文件
private static void downloadFile(ChannelSftp sftpChannel, String remoteFile, String localDir) {
try (FileOutputStream fos = new FileOutputStream(localDir + remoteFile.substring(remoteFile.lastIndexOf("/") + 1))) {
sftpChannel.get(remoteFile, fos);
System.out.println("File downloaded successfully.");
} catch (Exception e) {
e.printStackTrace();
}
}
// 列出目录文件
private static void listFiles(ChannelSftp sftpChannel, String remoteDir) {
try {
Vector<ChannelSftp.LsEntry> fileList = sftpChannel.ls(remoteDir);
System.out.println("Files in directory:");
for (ChannelSftp.LsEntry entry : fileList) {
System.out.println(" - " + entry.getFilename());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
代码说明
- 连接服务器 :
- 使用
JSch
库建立 SSH 连接。 - 提供用户名、密码和主机 IP 地址。
- 使用
- 上传文件 :
- 使用
sftpChannel.put()
方法将本地文件上传到服务器。
- 使用
- 下载文件 :
- 使用
sftpChannel.get()
方法将远程文件下载到本地。
- 使用
- 列出目录内容 :
- 使用
sftpChannel.ls()
方法获取远程目录中的文件列表。
- 使用
- 安全选项 :
- 配置
StrictHostKeyChecking
为no
,以忽略主机密钥检查(生产环境中建议添加已知主机密钥验证)。
- 配置
测试
- 将代码中的
SFTP_HOST
、SFTP_USER
和SFTP_PASSWORD
替换为实际的 SFTP 服务器信息。 - 修改
localFile
和remoteDir
为实际的文件路径和远程目录。
运行代码后,您应该能够上传、下载文件并列出远程目录的内容。
常见问题
- 权限不足 :
- 确保服务器上的目录权限正确,用户具有读写权限。
- 连接失败 :
- 检查服务器的防火墙设置,确保开放了端口 22。
- 依赖问题 :
- 确保 Maven 依赖已正确引入,或手动添加 JSch 的 JAR 包。