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

如果大家熟悉Linux的话,一定对ssh,sftp,scp等命令非常熟悉。ssh是一个安全协议,用来在不同系统或者服务

器之间进行安全连接。ssh 在连接和传送的过程中会加密所有的数据。具体的解释,大家可以参考百度百科的文

档。地址为:http://baike.baidu.com/view/16184.htm

但是SSH一般是基于客户端的或者Linux命令行的。比如客户端的工具:OpenSSH,putty,SSH

Tectia;在linux上大家可以通过ssh username@host连接到所要想连接的主机。但是如果在J2EE中,如何实

现SSH呢?进而可以实现SCP,SFTP的功能呢?下面介绍的JSCH就可以实现下边的功能。

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

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

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

maven配置如下:

com.jcraft

jsch

0.1.51

下面简单介绍下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 认证。

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

package com.somnus.util.base;

import java.io.ByteArrayInputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.util.Properties;

import java.util.Vector;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import com.jcraft.jsch.Channel;

import com.jcraft.jsch.ChannelSftp;

import com.jcraft.jsch.JSch;

import com.jcraft.jsch.Session;

import com.jcraft.jsch.SftpException;

/**

* sftp工具。注意:构造方法有两个:分别是基于密码认证、基于秘钥认证。

*

* @see http://xliangwu.iteye.com/blog/1499764

* @author Somnus

*/

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 in

* 输入流

* @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 sftp

* @return

* @throws SftpException

*/

public Vector listFiles(String directory) throws SftpException {

return sftp.ls(directory);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值