Java sftp ftp_Java中使用jcraft进行SFTP的上传下载

JSCH是一个纯粹的用java实现SSH功能的java library. 官方地址为:

http://www.jcraft.com/jsch/

GitHub 地址为:https://github.com/vngx/vngx-jsch

简单介绍下JSCH的特点:

1.基于DSA和RSA加密。

2.可以实现4中认证机制。分别是:

password

publickey(DSA,RSA)

keyboard-interactive

gss-api-with-mic

3.生成public/private key pair.

4.执行bash script 等脚本

5.可以通过HTTP/SOCK5 proxy

6.支持常见SSH1协议和SSH2协议

我们日常用到的JSCH主要是基于是密码认证和private key 认证。

基于密码认证的比较简单。简单代码如下:

导入pom依赖

<!-- 加入上传文件组件 -->
	  <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
	  <dependency>
		  <groupId>commons-io</groupId>
		  <artifactId>commons-io</artifactId>
		  <version>2.1</version>
	  </dependency>
	  <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
	  <dependency>
		  <groupId>commons-fileupload</groupId>
		  <artifactId>commons-fileupload</artifactId>
		  <version>1.3</version>
	  </dependency>
	  <!-- https://mvnrepository.com/artifact/commons-net/commons-net -->
	  <dependency>
		  <groupId>commons-net</groupId>
		  <artifactId>commons-net</artifactId>
		  <version>3.3</version>
	  </dependency>
	  
	  <dependency>
		  <groupId>com.jcraft</groupId>
		  <artifactId>jsch</artifactId>
		  <version>0.1.49</version>
	  </dependency>
package com.fs.his.registration.utils;

import com.jcraft.jsch.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.util.Properties;
import java.util.Vector;

/**
 * yhh
 */
public class SFTPUtil {
    private static final Logger LOG = LoggerFactory.getLogger(SFTPUtil.class);

    private ChannelSftp sftp;

    private String userName; // FTP 登录用户名

    private String password; // FTP 登录密码

    private String keyFilePath;// 私钥文件的路径

    private String host; // FTP 服务器地址IP地址

    private int port; // FTP 端口

    private Session sshSession;

    /**
     * 构造基于密码认证的sftp对象
     *
     * @param userName 用户名
     * @param password 登陆密码
     * @param host     服务器ip
     * @param port     fwq端口
     */

    public SFTPUtil(String userName, String password, String host, int port) {
        super();

        this.userName = userName;

        this.password = password;

        this.host = host;

        this.port = port;

    }

    /**
     * 构造基于秘钥认证的sftp对象
     *
     * @param userName    用户名
     * @param host        服务器ip
     * @param port        fwq端口
     * @param keyFilePath 私钥文件路径
     */

    public SFTPUtil(String userName, String host, int port, String keyFilePath) {
        super();

        this.userName = userName;

        this.host = host;

        this.port = port;

        this.keyFilePath = keyFilePath;

    }

    /**
     * 连接sftp服务器
     *
     * @throws Exception
     */

    public void connect() throws Exception {
        try {
            JSch jsch = new JSch();

            if (keyFilePath != null) {
                jsch.addIdentity(keyFilePath);// 设置私钥

                LOG.info("连接sftp,私钥文件路径:" + keyFilePath);

            }

            LOG.info("sftp host: " + host + "; userName:" + userName);

            sshSession = jsch.getSession(userName, host, port);

            LOG.debug("Session 已建立.");

            if (password != null) {
                sshSession.setPassword(password);

            }

            Properties sshConfig = new Properties();

            sshConfig.put("StrictHostKeyChecking", "no");

            sshSession.setConfig(sshConfig);

            sshSession.connect();

            LOG.debug("Session 已连接.");

            Channel channel = sshSession.openChannel("sftp");

            channel.connect();

            sftp = (ChannelSftp) channel;

            LOG.info("连接到SFTP成功。host: " + host);

        } catch (Exception e) {
            LOG.error("连接sftp失败!", e);

            throw e;

        }

    }

    /**
     * 关闭连接 server
     */

    public void disconnect() {
        if (sftp != null) {
            if (sftp.isConnected()) {
                sftp.disconnect();

                sshSession.disconnect();

                LOG.info("sftp连接关闭成功!" + sftp);

            } else if (sftp.isClosed()) {
                LOG.warn("sftp 已经关闭,不需要重复关闭!" + sftp);

            }

        }

    }

    /**
     * 将输入流的数据上传到sftp作为文件
     *
     * @param directory    上传到该目录
     * @param sftpFileName sftp端文件名
     * @param
     * @throws Exception
     */

    public void upload(String directory, String sftpFileName, InputStream input) throws Exception {
        try {
            try {// 如果cd报异常,说明目录不存在,就创建目录

                sftp.cd(directory);

            } catch (Exception e) {
                sftp.mkdir(directory);

                sftp.cd(directory);

            }

            sftp.put(input, sftpFileName);

            LOG.info("sftp上传成功!文件名:" + sftpFileName);

        } catch (Exception e) {
            LOG.error("sftp上传失败!文件名" + sftpFileName, e);

            throw e;

        }

    }

    /**
     * 上传单个文件
     *
     * @param directory  上传到sftp目录
     * @param uploadFile 要上传的文件,包括路径
     * @throws Exception
     */

    public void upload(String directory, String uploadFile) throws Exception {
        File file = new File(uploadFile);

        upload(directory, file.getName(), new FileInputStream(file));

    }

    /**
     * 将byte[]上传到sftp,作为文件。注意:从String生成byte[]是,要指定字符集。
     *
     * @param directory    上传到sftp目录
     * @param sftpFileName 文件在sftp端的命名
     * @param byteArr      要上传的字节数组
     * @throws Exception
     */

    public void upload(String directory, String sftpFileName, byte[] byteArr) throws Exception {
        upload(directory, sftpFileName, new ByteArrayInputStream(byteArr));

    }

    /**
     * 将字符串按照指定的字符编码上传到sftp
     *
     * @param directory    上传到sftp目录
     * @param sftpFileName 文件在sftp端的命名
     * @param dataStr      待上传的数据
     * @param charsetName  sftp上的文件,按该字符编码保存
     * @throws Exception
     */

    public void upload(String directory, String sftpFileName, String dataStr, String charsetName) throws Exception {
        upload(directory, sftpFileName, new ByteArrayInputStream(dataStr.getBytes(charsetName)));

    }

    /**
     * 下载文件
     *
     * @param directory    下载目录
     * @param downloadFile 下载的文件
     * @param saveFile     存在本地的路径
     * @throws Exception
     */

    public void download(String directory, String downloadFile, String saveFile) throws Exception {
        try {
            if (directory != null && !"".equals(directory)) {
                sftp.cd(directory);

            }

            File file = new File(saveFile);

            sftp.get(downloadFile, new FileOutputStream(file));

            LOG.info("sftp下载文件成功!文件名" + downloadFile);

        } catch (Exception e) {
            LOG.error("sftp下载文件失败!文件名:" + downloadFile, e);

            throw e;

        }

    }

    /**
     * 下载文件
     *
     * @param directory    下载目录
     * @param downloadFile 下载的文件名
     * @return 字节数组
     * @throws Exception
     */

    public byte[] download(String directory, String downloadFile) throws Exception {
        byte[] fileData = null;

        try {
            if (directory != null && !"".equals(directory)) {
                sftp.cd(directory);

            }

            InputStream is = sftp.get(downloadFile);

            fileData = new byte[is.available()];

            is.read(fileData);

            LOG.info("sftp下载文件成功!文件名" + downloadFile);

        } catch (SftpException e) {
            LOG.error("sftp下载文件失败!文件名:" + downloadFile, e);

            throw e;

        } catch (IOException e) {
            LOG.error("sftp下载文件读取失败!文件名:" + downloadFile, e);

            throw e;

        }

        return fileData;

    }

    /**
     * 删除文件
     *
     * @param directory  要删除文件所在目录
     * @param deleteFile 要删除的文件
     * @throws Exception
     */

    public void delete(String directory, String deleteFile) throws Exception {
        try {
            sftp.cd(directory);

            sftp.rm(deleteFile);

        } catch (Exception e) {
            LOG.error("sftp删除文件失败" + deleteFile, e);

            throw e;

        }

    }

    /**
     * 列出目录下的文件
     *
     * @param directory 要列出的目录
     * @param
     * @return
     * @throws SftpException
     */

    public Vector listFiles(String directory) throws SftpException {
        return sftp.ls(directory);

    }
}
@RequestMapping("/uploadImages")
    public String uploadFiles( @RequestParam("file") MultipartFile file) throws Exception {
        SFTPUtil sftpUtil = new SFTPUtil(username, password, host, port);
        sftpUtil.connect();
        sftpUtil.upload(“文件存储路径”,file.getOriginalFilename(),file.getInputStream());
        sftpUtil.disconnect();
        return "" ;
    }

转载于
https://blog.csdn.net/weixin_29053067/article/details/114555191?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Java实现SFTP文件传输,可以使用JSch库。以下是一个简单的示例代码,演示如何使用JSch实现SFTP上传文件到资源服务器: ```java import com.jcraft.jsch.*; public class SFTPUploader { public static void main(String[] args) { String host = "sftp.example.com"; String username = "your-username"; String password = "your-password"; int port = 22; String localFilePath = "/path/to/local/file.txt"; String remoteFilePath = "/path/to/remote/file.txt"; JSch jsch = new JSch(); Session session = null; try { session = jsch.getSession(username, host, port); session.setConfig("StrictHostKeyChecking", "no"); session.setPassword(password); session.connect(); ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp"); channelSftp.connect(); channelSftp.put(localFilePath, remoteFilePath); channelSftp.disconnect(); } catch (JSchException | SftpException e) { e.printStackTrace(); } finally { if (session != null) { session.disconnect(); } } } } ``` 在这个示例代码,`host`是资源服务器的主机名,`username`和`password`是SFTP登录凭据,`port`是SFTP端口,默认为22。`localFilePath`是本地文件路径,`remoteFilePath`是远程文件路径。 `JSch`实例用于创建SFTP会话,`Session`实例用于连接到资源服务器。在此示例代码,我们使用`StrictHostKeyChecking`配置来禁用主机密钥检查。接下来,我们打开一个SFTP通道,并将本地文件上传到远程服务器。 请注意,如果您需要进行多个文件传输,则应该重用单个`Session`和`ChannelSftp`实例,而不是每次传输都打开和关闭新的会话和通道。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值