百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 软件资讯 > 正文

Java SFTP 上传、下载等操作

ninehua 2024-11-17 19:51 36 浏览

Java SFTP 上传、下载等操作

实际开发中用到了 SFTP 用于交换批量数据文件,然后琢磨了下这方面的东西,基于 JSch 写了个工具类记录下,便于日后使用。

JSchSSH2 的纯Java实现。JSch 可以连接到sshd服务器并使用端口转发,X11转发,文件传输等,并且很方便的将其功能集成到Java程序中。

1、添加依赖

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

2、SFTPUtils 工具类

public class SFTPUtils {
    private Logger log = LoggerFactory.getLogger(SFTPUtils.class);

    private String host; // 主机名称/IP
    private int port = 22; // 端口
    private String username; // 用户名
    private String password; // 密码

    private ChannelSftp sftp = null;
    private Channel channel = null;
    private Session session = null;

    public SFTPUtils(String host, String userName, String password) {
        this.host = host;
        this.username = userName;
        this.password = password;
    }

    public SFTPUtils(String host, int port, String userName, String password) {
        this.host = host;
        this.port = port;
        this.username = userName;
        this.password = password;
    }

    /**
     * 连接SFTP服务器
     *
     * @throws JSchException
     */
    public void connect() throws JSchException {
        JSch jSch = new JSch();
        session = jSch.getSession(username, host, port);
        session.setPassword(password);
        session.setConfig(this.buildConfig());
        session.connect();
        channel = session.openChannel("sftp");
        channel.connect();
        sftp = (ChannelSftp) channel;
        log.info("连接主机:{} 登录成功", host);
    }

    /**
     * 构建连接配置参数
     *
     * @return Properties
     */
    private Properties buildConfig() {
        Properties properties = new Properties();
        properties.put("StrictHostKeyChecking", "no");
        return properties;
    }

    /**
     * 关闭连接
     */
    public void disconnect() {
        try {
            if (sftp.isConnected()) {
                sftp.disconnect();
            }
            if (channel.isConnected()) {
                channel.disconnect();
            }
            if (session.isConnected()) {
                session.disconnect();
            }
        } catch (Throwable e) {
            //ignore
        }
    }

    /**
     * 下载文件
     *
     * @param sftpPath   服务器路径,不指定路径默认是FTP的根路径,指定路径是指的SFTP的根路径下开始。
     *                   例如:SFTP根路径为:/sftp/file,那么默认下载文件会去根路径下载,而指定 sftpPath 也是从根路径下开始;
     *                   指定 sftpPath 为 word,那么是从 /sftp/file/word 路径中查找文件下载。为空表示忽略该参数。
     * @param fileName   文件名
     * @param toFilePath 下载保存文件路径,路径+文件名,例如:d:/test.txt
     * @return
     */
    public boolean downloadFile(String sftpPath, String fileName, String toFilePath) {
        FileOutputStream fileOutputStream = null;
        try {
            if (StringUtils.isNotBlank(sftpPath)) {
                sftp.cd(sftpPath);
            }
            fileOutputStream = new FileOutputStream(new File(toFilePath));
            sftp.get(fileName, fileOutputStream);
            return true;
        } catch (Exception e) {
            log.error("下载文件错误", e);
        } finally {
            if (fileOutputStream != null) {
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    //ignore
                }
            }
        }
        return false;
    }

    /**
     * 上传文件
     *
     * @param sftpPath      服务器路径,不指定路径默认是FTP的根路径,指定路径是指的SFTP的根路径下开始。
     *                      例如:SFTP根路径为:/sftp/file,那么默认下载文件会去根路径下载,而指定 sftpPath 也是从根路径下开始;
     *                      指定 sftpPath 为 word,那么是从 /sftp/file/word 路径中查找文件下载。为空表示忽略该参数。
     * @param fileName      上传后文件名
     * @param localFilePath 文件路径,路径+文件名,例如:d:/test.txt
     * @return
     */
    public boolean uploadFile(String sftpPath, String fileName, String localFilePath) {
        FileInputStream inputStream = null;
        try {
            if (StringUtils.isNotBlank(sftpPath)) {
                sftp.cd(sftpPath);
            }
            inputStream = new FileInputStream(new File(localFilePath));
            sftp.put(inputStream, fileName);
            return true;
        } catch (Exception e) {
            log.error("上传文件错误", e);
        } finally {
            if (null != inputStream) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    //ignore
                }
            }
        }
        return false;
    }

    /**
     * 上传文件
     *
     * @param sftpPath    服务器路径,不指定路径默认是FTP的根路径,指定路径是指的SFTP的根路径下开始。
     *                    例如:SFTP根路径为:/sftp/file,那么默认下载文件会去根路径下载,而指定 sftpPath 也是从根路径下开始;
     *                    指定 sftpPath 为 word,那么是从 /sftp/file/word 路径中查找文件下载。为空表示忽略该参数。
     * @param fileName    上传后文件名
     * @param inputStream 文件输入流
     * @return
     */
    public boolean uploadFile(String sftpPath, String fileName, InputStream inputStream) {
        try {
            if (StringUtils.isNotBlank(sftpPath)) {
                sftp.cd(sftpPath);
            }
            sftp.put(inputStream, fileName);
            return true;
        } catch (Exception e) {
            log.error("上传文件错误", e);
        } finally {
            if (null != inputStream) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    //ignore
                }
            }
        }
        return false;
    }

    /**
     * 删除文件
     *
     * @param sftpPath 服务器路径,不指定路径默认是FTP的根路径,指定路径是指的SFTP的根路径下开始。
     *                 例如:SFTP根路径为:/sftp/file,那么默认下载文件会去根路径下载,而指定 sftpPath 也是从根路径下开始;
     *                 指定 sftpPath 为 word,那么是从 /sftp/file/word 路径中查找文件下载。为空表示忽略该参数。
     * @param fileName 文件名
     * @return
     */
    public boolean deleteFile(String sftpPath, String fileName) {
        try {
            if (StringUtils.isNotBlank(sftpPath)) {
                sftp.cd(sftpPath);
            }
            sftp.rm(fileName);
            return true;
        } catch (Exception e) {
            log.error("删除文件失败", e);
        }
        return false;
    }

    /**
     * 查询指定目录下信息
     *
     * @param sftpPath 服务器路径,不指定路径默认是FTP的根路径,指定路径是指的SFTP的根路径下开始。
     *                 例如:SFTP根路径为:/sftp/file,那么默认下载文件会去根路径下载,而指定 sftpPath 也是从根路径下开始;
     *                 指定 sftpPath 为 word,那么是从 /sftp/file/word 路径中查找文件下载。为空表示忽略该参数。
     * @return
     */
    public List<String> listFiles(String sftpPath) throws SftpException {
        Vector files = sftp.ls(sftpPath);
        List<String> result = new ArrayList<String>();
        Iterator iterator = files.iterator();
        while (iterator.hasNext()) {
            LsEntry isEntity = (LsEntry) iterator.next();
            result.add(isEntity.getFilename());
        }
        return result;
    }
}

在使用的的时候,需要调用 connect()开启连接,使用完后调用 disconnect() 关闭连接 。

jsch 官方的文档说明 http://www.jcraft.com/jsch/

本文主要用于个人记录笔记!

相关推荐

Java 反编译工具的使用与对比分析

前言Java反编译,一听可能觉得高深莫测,其实反编译并不是什么特别高级的操作,Java对于Class字节码文件的生成有着严格的要求,如果你非常熟悉Java虚拟机规范,了解Class字节...

Java代码混淆工具Allatori混淆jar可执行包的使用方法

Allatori简介Allatori是第二代Java混淆器,可为您的知识产权提供全方位的保护。Allatori不只是混淆,它还最小化应用程序大小,并提高速度,同时除了您和您?的团队之外,任何人...

window下将spring boot-jar添加到服务中,实现自动启动

1、下载winsw:https://github.com/winsw/winsw/releases...

idea maven 依赖包报红

有不少小伙伴遇到这个问题问我该怎么破,其实这个问题的答案在网上已经烂大街了,随便一查就一堆(其中不少是复制粘贴的且抄都抄不全,令人汗颜!),在此我记录下解决方案。解决方案如下:maven的settin...

使用 XJar 对程序 jar 包加密,防止被破解

1.新建一个空的maven项目,并在pom文件中添加:<dependencies><dependency><groupId>com.github.c...

maven 处理多版本 jar包依赖冲突

一。参考文档https://maven.apache.org/plugins/maven-dependency-plugin/examples/resolving-conflicts-using-th...

IntelliJ Idea下jar包引入失败的处理方法

IntelliJIdea下jar包引入失败的处理方法标签:IntelliJIDEAIDEA导入新项目或者更新的时候,显示“Cannotresolvesymbol'XXX‘’”,之前有...

将本地jar 批量发布到 Nexus 私服

前言在日常开发过程中,我们有遇到将项目依赖通过mvndeploy发布到自己的公司的私服,以便其他人/环境统一下载入口。但是也有一些特殊情况,比如只能拿到第三方(或甲方)的依赖jar,并不能拿到...

如何优雅替换第三方依赖中的类?

在项目中需要依赖其他第三方的jar包,但有时我们需要扩展第三方jar的功能,或者修复依赖中已知还未修复的bug,但碰到过很多种情况,第三方类库中并没有提供对应的扩展点导致无法优雅的使用继承等方法对代码...

Jarboot-一个功能强大易用的Java进程启动器

什么是JarbootJarboot是一个功能强大易用的Java进程启动器,使用jarboot可以方便的启动一批的Java进程,支持按照依赖的优先级顺序启动、进程守护、文件监控重启、进程在线调试。...

IDEA 这么设置 Maven,再也不用担心依赖下载失败了

Hello,大家好,我是楼下小黑哥。B站视频版本...

一个小技巧,Maven 打 Jar 包体积缩小100倍

大家好,我是互联网架构小马哥!为了大家能够从从项目集成的苦力活中解放出来,最近这一周,整理了两篇关于Jenkins构建、部署的文章,感兴趣的朋友可以看看:【...

还在用nohup启动java jar服务?试试强大的systemctl吧

nohup直译过来就是不挂断,要运行后台中的nohup命令,添加&(表示“and”的符号)到命令的尾部,使用nohup启动的例子:nohup/usr/bin/java-jar/dat...

推荐一款产品-防止JAVA代码反编译

VirboxProtector是深思数盾科技股份有限公司经过多年技术深耕开发的一款高强度虚拟机外壳。VirboxProtector集加密、压缩、混淆虚拟化等于一身。支持的操作系统包括Windo...

如何使用Axure制作交互文档?

编辑导语:Axure作为交互文档有着可交互、兼容性好的优势,本文作者结合亲身的实践操作,为我们分享了如何使用Axure制作交互文档。01Axure软件介绍这次团队决定使用的是Axure9版...