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

Java SFTP 上传、下载等操作

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

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/

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

相关推荐

免费办公软件LibreOffice 4.3.3正式版下载

IT之家(www.ithome.com):免费办公软件LibreOffice4.3.3正式版下载IT之家10月30日消息,知名文档基金会TDF正式发布旗下免费办公软件LibreOffice4.3....

拜拜WPS?微软这款全新的三合一Office,免费无广告,真让人惊艳

无论是在手机上办公,还是在电脑上办公,很多时候我们需要处理这3种文档:Word、Excel、以及PPT。而想要在手机上处理这些文档,我们一般会用到这两款软件,分别是Office和WPS。而由于Offi...

免费获得微软办公软件 Word、Excel 和 PowerPoint

是的,您无需花一分钱就可以使用微软Microsoft365中的所有工具。您可能需要从Microsoft365或者MicrosoftWord文档、PowerPoint演示文稿或其他基本工...

免费办公软件LibreOffice 4.3.1 正式版下载

IT之家(www.ithome.com):免费办公软件LibreOffice4.3.1正式版下载8月29日消息,知名文档基金会TDF正式发布旗下免费办公软件LibreOffice4.3.1正式版...

再见WPS!微软新出的免费Office软件,我一用就爱上了

步入职场后,最让你们头疼的是什么?要我说,一定是这件事情!好不容易熬到假期,约好小姐妹出门逛街,路上突然领导发来消息,要求审核几份紧急文件:强烈的求生欲使我不得不掏出WPSOffice,争分夺秒地...

更懂中小企业的打印机!惠普优系列LaserJet Pro 4004d打印机评测

对于中小企业来说,选购一台优秀的打印机能够在很大程度上提高员工的工作效率。质量高、成本低、速度快是中小企业选购打印机时最看重的三点。惠普优系列LaserJetPro4004d专业级自动双面激光打印机(...

真正的一机多能 选打印机选它准没错

对于企业用户来讲,打印机产品是必不可少的存在。为了能够有效提升办公的效率,不少用户在选择打印机时会比较关注打印机的功能和易用性。今天给大家推荐这款惠普1188nw激光一体机,就是个不错的选择。这款一体...

只因效率更高 618我为公司选这款打印机

不得不说对于中小型企业和工作室用户来说,办公的效率尤为重要。但由于中小型企业的规模较小,所以说能配备的打印机设备数量就十分有限。不少员工在打印时都会遇到排队的现象,因此影响了办公的效率。为了解决这一难...

千元预算购机 这三款打印机很值得买

现如今为了能够满足日常的打印需求,越来越多的家庭用户会考虑购买一台打印机产品。由于对打印机产品并不是很了解,不少朋友在选购时会产生困扰。今天这里给大家推荐三款打印机,价格在一千元左右,非常具有性价比。...

手把手教学!惠普打印机安装全流程,3分钟搞定,新手必看!

还在为安装惠普打印机头疼?别急,这篇超详细的安装指南,让你轻松上手,3分钟搞定!无论是USB连接还是无线设置,统统简单易懂,看完就能用!如何安装惠普打印机?_高清1080P在线观看平台_腾讯视频一、硬...

惠普喷墨打印机无线连接全流程指南

以下这些操作适用于带有无线功能的惠普喷墨打印机(像DeskJet系列、OfficeJet系列),这里面包含了三种常见的连接方式以及一些需要注意的地方一、控制面板直连法(通用型)启动准备打印机开机...

打印机连接Wi-Fi的详细步骤

以下是打印机连接Wi-Fi的详细步骤指南,涵盖主流品牌通用方法及常见问题解决:一、连接前准备工作确认设备兼容性检查打印机是否支持Wi-Fi功能(机身有Wi-Fi标识或查看说明书)。确保路由器开启2.4...

重新定义大粉仓,2.0版到来 惠普创系列2606sdw打印机评测

  2019年5月,惠普发布创系列激光打印机,开启打印机“激光大粉仓1.0”时代,并首创“智能闪充”技术,随机附带的原装耗材即可实现5000页大印量,同时也让激光打印机能够实现快速充粉,15秒就可让创...

不足千元的打印机表现如何?实测来了

为了能够满足日常的打印需求,打印机已经成为了很多用户的刚需。由于购买的预算有限,不少家庭用户或者初创企业在选购打印机时,就会考虑到打印机的售价。那么不到千元的打印机表现如何,我们来看实测。1小巧的机...

899元的激光打印机怎么样?实测来看

如果日常经常会有打印文件的需求,那么购买一台打印机会更加方便。而为了追求更高的性价比,不少用户在选购打印机时会更关注打印机的价格。激光打印机相比于喷墨打印机而言,虽然打印速度上更有优势,但是价格也会更...