Java实现SFTP文件上传的详细教程与代码解析

 更新时间:2025年05月21日 09:40:49   作者:遥不可及~~斌  
在现代软件开发中,文件传输是一个常见的需求,尤其是在需要将文件上传到远程服务器时,本文将详细介绍如何使用Java实现SFTP文件上传,需要的可以参考一下

在现代软件开发中,文件传输是一个常见的需求,尤其是在需要将文件上传到远程服务器时。SFTP(SSH文件传输协议)是一种安全的文件传输协议,广泛用于在客户端和服务器之间传输文件。本文将详细介绍如何使用Java实现SFTP文件上传,并提供完整的代码示例。

1. 什么是SFTP

SFTP(SSH File Transfer Protocol)是一种基于SSH协议的文件传输协议。与FTP不同,SFTP通过加密的SSH连接传输文件,确保了数据传输的安全性。SFTP通常用于需要安全传输文件的场景,如上传日志文件、备份数据等。

2. 使用JSch库实现SFTP

在Java中,我们可以使用JSch库来实现SFTP文件上传。JSch是一个纯Java实现的SSH2库,支持SFTP、SCP、端口转发等功能。本文将使用JSch来实现SFTP文件上传。

3. 实现步骤

3.1 添加依赖

首先,我们需要在项目中添加JSch库的依赖。如果你使用的是Maven项目,可以在pom.xml中添加以下依赖:

<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
</dependency>

3.2 创建SFTP工具类

接下来,我们创建一个SftpUploadUtil工具类,用于封装SFTP连接、文件上传、下载和删除等操作。以下是完整的代码实现:

package com.example.demo.util;

import com.jcraft.jsch.*;
import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SftpUploadUtil {
    private static final Logger logger = LoggerFactory.getLogger(SftpUploadUtil.class);

    private Session session;
    private ChannelSftp channel;

    /**
     * 连接到SFTP服务器
     * @param host SFTP服务器主机名
     * @param port SFTP服务器端口
     * @param username 用户名
     * @param password 密码
     * @throws JSchException 如果连接失败
     */
    public void connect(String host, int port, String username, String password) throws JSchException {
        JSch jsch = new JSch();
        session = jsch.getSession(username, host, port);
        session.setPassword(password);

        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);

        session.connect();
        channel = (ChannelSftp) session.openChannel("sftp");
        channel.connect();
    }

    /**
     * 上传文件到SFTP服务器
     * @param localFilePath 本地文件路径
     * @param remoteFilePath 远程文件路径
     * @throws Exception 如果上传失败
     */
    public void uploadFile(String localFilePath, String remoteFilePath) throws Exception {
        File localFile = new File(localFilePath);
        String remoteDir = remoteFilePath.substring(0, remoteFilePath.lastIndexOf('/'));
        try {
            channel.cd(remoteDir);
        } catch (SftpException e) {
            logger.info("Creating remote directory: {}", remoteDir);
            createRemoteDirectory(remoteDir);
        }
        try (FileInputStream fis = new FileInputStream(localFile)) {
            channel.put(fis, remoteFilePath);
        }
    }

    /**
     * 从SFTP服务器下载文件
     * @param remoteFilePath 远程文件路径
     * @param localFilePath 本地文件路径
     * @throws Exception 如果下载失败
     */
    public void downloadFile(String remoteFilePath, String localFilePath) throws Exception {
        channel.get(remoteFilePath, localFilePath);
    }

    /**
     * 删除SFTP服务器上的文件
     * @param remoteFilePath 远程文件路径
     * @throws SftpException 如果删除失败
     */
    public void deleteFile(String remoteFilePath) throws SftpException {
        channel.rm(remoteFilePath);
    }

    /**
     * 在SFTP服务器上创建远程目录
     * @param path 远程目录路径
     * @throws SftpException 如果创建失败
     */
    private void createRemoteDirectory(String path) throws SftpException {
        String[] folders = path.split("/");
        StringBuilder currentPath = new StringBuilder();
        for (String folder : folders) {
            if (!folder.isEmpty()) {
                currentPath.append("/").append(folder);
                try {
                    channel.cd(currentPath.toString());
                } catch (SftpException e) {
                    channel.mkdir(currentPath.toString());
                    logger.info("Created directory: {}", currentPath.toString());
                }
            }
        }
    }

    /**
     * 断开与SFTP服务器的连接
     */
    public void disconnect() {
        if (channel != null) {
            channel.disconnect();
        }
        if (session != null) {
            session.disconnect();
        }
    }
}

3.3 代码解析

connect方法:用于连接到SFTP服务器。通过JSch库创建一个SSH会话,并打开一个SFTP通道。

uploadFile方法:用于将本地文件上传到SFTP服务器。如果远程目录不存在,会自动创建目录。

downloadFile方法:用于从SFTP服务器下载文件到本地。

deleteFile方法:用于删除SFTP服务器上的文件。

createRemoteDirectory方法:用于在SFTP服务器上创建远程目录。

disconnect方法:用于断开与SFTP服务器的连接。

3.4 使用示例

以下是一个简单的使用示例,展示如何上传文件到SFTP服务器:

public class SftpExample {
    public static void main(String[] args) {
        SftpUploadUtil sftpUtil = new SftpUploadUtil();
        try {
            // 连接到SFTP服务器
            sftpUtil.connect("sftp.example.com", 22, "username", "password");

            // 上传文件
            sftpUtil.uploadFile("/path/to/local/file.txt", "/path/to/remote/file.txt");

            // 下载文件
            sftpUtil.downloadFile("/path/to/remote/file.txt", "/path/to/local/downloaded_file.txt");

            // 删除文件
            sftpUtil.deleteFile("/path/to/remote/file.txt");

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 断开连接
            sftpUtil.disconnect();
        }
    }
}

4. 总结

本文详细介绍了如何使用Java和JSch库实现SFTP文件上传。通过封装SftpUploadUtil工具类,我们可以轻松地实现文件的传输、下载和删除等操作。

以上就是Java实现SFTP文件上传的详细教程与代码解析的详细内容,更多关于Java SFTP文件上传的资料请关注脚本之家其它相关文章!

相关文章

  • Spring MVC 与 CORS跨域的详细介绍

    Spring MVC 与 CORS跨域的详细介绍

    本文介绍了 CORS 的知识以及如何在 Spring MVC 中配置 CORS,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Java中unsafe操作实例总结

    Java中unsafe操作实例总结

    本篇文章给大家分享了关于Java中unsafe操作的相关知识点以及相关的实例代码,有需要的朋友可以学习参考下。
    2018-03-03
  • Java常用HASH算法总结【经典实例】

    Java常用HASH算法总结【经典实例】

    这篇文章主要介绍了Java常用HASH算法,结合实例形式总结分析了Java常用的Hash算法,包括加法hash、旋转hash、FNV算法、RS算法hash、PJW算法、ELF算法、BKDR算法、SDBM算法、DJB算法、DEK算法、AP算法等,需要的朋友可以参考下
    2017-09-09
  • IDEA中程序包Org.Springframework.Boot不存在问题及解决

    IDEA中程序包Org.Springframework.Boot不存在问题及解决

    这篇文章主要介绍了IDEA中程序包Org.Springframework.Boot不存在问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • SpringBoot实现过滤器、拦截器与切片的实现和区别

    SpringBoot实现过滤器、拦截器与切片的实现和区别

    本文详细介绍了使用过滤器、拦截器与切片实现每个请求耗时的统计,并比较三者的区别与联系,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • spring boot实现图片上传到后台的功能(浏览器可直接访问)

    spring boot实现图片上传到后台的功能(浏览器可直接访问)

    这篇文章主要介绍了spring boot实现图片上传到后台的功能(浏览器可直接访问),需要的朋友可以参考下
    2022-04-04
  • Java lambda表达式与泛型整理总结

    Java lambda表达式与泛型整理总结

    Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名。泛型编程,故如其名,是一个泛化的编程方式。其实现原理为程序员编写一个函数/类的代码示例,让编译器去填补出不同的函数实现
    2022-07-07
  • JAVA集合框架专题

    JAVA集合框架专题

    这篇文章主要介绍了JAVA集合框架的相关知识,文中讲解非常细致,帮助大家更好的理解学习JAVA框架,感兴趣的朋友快来了解下
    2020-06-06
  • java编程FinalReference与Finalizer原理示例详解

    java编程FinalReference与Finalizer原理示例详解

    这篇文章主要为大家介绍了java编程FinalReference与Finalizer的核心原理以及示例源码的分析详解,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-01-01
  • Java之Set String List互转方式

    Java之Set String List互转方式

    文章总结了Java中Set与String以及List之间的相互转换方法,通过代码示例展示了如何将Set转为List,再将List转为Set,以及如何将List转为String,最后又将String转为List的过程
    2026-04-04

最新评论