Java Sftp上传下载文件

时间:2021-08-31 12:18:24

 

需要使用jar包  jsch-0.1.50.jar 

 

sftp上传下载实现类

package com.bstek.transit.sftp;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

public class SFtpClient {

private String ftpHost;
private int ftpPort;
private String uploadRemotePath; //上传到的服务器目录
private String downloadRemotePath;//从服务器哪个目录下载
private String userName;
private String password;
private int timeOut = 30000;

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

public SFtpClient() {
super();
}

public SFtpClient(String ftpHost, int ftpPort, String uploadRemotePath, String downloadRemotePath, String userName, String password) {
super();
this.ftpHost = ftpHost;
this.ftpPort = ftpPort<=0? 22:ftpPort ;
this.uploadRemotePath = uploadRemotePath;
this.downloadRemotePath = downloadRemotePath;
this.userName = userName;
this.password = password;
}

/**
* 利用JSch包通过SFTP链接
*
@throws JSchException
*/
public void connect() throws JSchException {
try {
JSch jsch
= new JSch();
session
= jsch.getSession(userName, ftpHost, ftpPort);
// 如果服务器连接不上,则抛出异常
if (session == null) {
throw new JSchException("session is null");
}
session.setPassword(password);
// 设置密码
session.setConfig("StrictHostKeyChecking", "no");// 设置第一次登陆的时候提示,可选值:(ask
// | yes | no)
//设置登陆超时时间
session.connect(timeOut);

channel
= (ChannelSftp) session.openChannel("sftp");// 创建sftp通信通道
channel.connect(1000);

}
catch (JSchException e) {
e.printStackTrace();
session.disconnect();
channel.disconnect();
throw e;
}

}

/**
* 上传文件
*
@param localFile 本地上传文件
*
@throws SftpException
*
@throws IOException
*/
public void uploadFile(File localFile) throws SftpException, IOException {

String fullremoteFileName
= this.uploadRemotePath + localFile.getName();
this.uploadFile(localFile, fullremoteFileName);
}

public void uploadFile(File localFile, String fullremoteFileName) throws IOException, SftpException {
OutputStream outstream
= null;
InputStream instream
= null;

try {
// 判断是否是文件夹
if (!isPath(fullremoteFileName.substring(0, fullremoteFileName.lastIndexOf("/")))) {
createPath(fullremoteFileName.substring(
0, fullremoteFileName.lastIndexOf("/")));
}

outstream
= channel.put(fullremoteFileName);
instream
= new FileInputStream(localFile);

byte b[] = new byte[1024];
int n;
while ((n = instream.read(b)) != -1) {
outstream.write(b,
0, n);
}
outstream.flush();

}
catch (IOException e) {
e.printStackTrace();
throw e;
}
finally {
try {
instream.close();
}
catch (IOException e) {
e.printStackTrace();
}
try {
outstream.close();
}
catch (IOException e) {
e.printStackTrace();
}
}

}
/**
* 下载文件
*
@param remeotFileName
*
@param downloadLocalFile 下载到本地的文件
*
@throws SftpException
*
@throws IOException
*/
public void downloadFile(String remeotFileName, File downloadLocalFile) throws SftpException, IOException {

String fullremoteDownloadFileName
= this.downloadRemotePath + remeotFileName;
this.downloadFile(downloadLocalFile, fullremoteDownloadFileName);
}

public void downloadFile(File downloadLocalFile, String fullremoteDownloadFileName) throws IOException, SftpException {
OutputStream outstream
= null;
InputStream instream
= null;

try {

instream
= channel.get(fullremoteDownloadFileName);
outstream
= new FileOutputStream(downloadLocalFile);

byte b[] = new byte[1024];
int n;
while ((n = instream.read(b)) != -1) {
outstream.write(b,
0, n);
}
outstream.flush();

}
catch (IOException e) {
throw e;
}
catch (SftpException e) {
throw e;
}
finally {
try {
if(instream!=null){
instream.close();
}
}
catch (IOException e) {
e.printStackTrace();
}
try {
if(outstream != null){
outstream.close();
}
}
catch (IOException e) {
e.printStackTrace();
}
}

}


public void uploadFile(String localPath,String localFileName) throws SftpException, IOException {
this.uploadFile(localPath,localFileName, localFileName);

}

public void uploadFile(String localPath,String localFileName, String remoteFileName) throws SftpException, IOException {
String fullLocalFileName
= localPath + localFileName;
String fullremoteFileName
=this.uploadRemotePath + remoteFileName;
uploadFile(
new File(fullLocalFileName), fullremoteFileName);
}

public void disconnect() {
session.disconnect();
channel.disconnect();
}

public void createPath(String remotePath) {
String[] paths
= remotePath.split("/");
String currentPath;
if (remotePath.startsWith("/")) {
currentPath
= "/";
}
else {
currentPath
= "";
}

for (String path : paths) {
if ("".equals(path)) {
continue;
}
currentPath
+= path + "/";
try {
channel.mkdir(currentPath);
}
catch (SftpException e) {
// e.printStackTrace();
// throw e;
}
}
}

public boolean isPath(String remotePath) {
// 判断是否是文件夹
try {
channel.cd(channel.getHome());
channel.cd(remotePath);
channel.cd(channel.getHome());
return true;
}
catch (SftpException e1) {
// e1.printStackTrace();
return false;
}
}

public static void main(String[] args) throws IOException {
// String ftpHost = "10.181.77.68";
// int ftpPort = 22;
// String localPath = "D:\\temp\\";
// String remotePath = "usr/WebSphere/tep/";
// String userName = "wasadm";
// String password = "wasadm";
//
// SFtpClient sftp = new SFtpClient(ftpHost, ftpPort, localPath,
// remotePath, userName, password);
// try {
// sftp.connect();
// } catch (JSchException e) {
// e.printStackTrace();
// }
// try {
// sftp.uploadFile("helloworld\\pom.xml");
// } catch (Exception e) {
// e.printStackTrace();
// }
// sftp.disconnect();
}

}

 

sftp上传下载封装类

package com.bstek.transit.sftp;

import java.io.File;
import java.io.IOException;
import java.util.List;

import org.apache.log4j.Logger;

import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.SftpException;

public class SFtpTools {

private final static Logger logger = Logger.getLogger(SFtpTools.class);

private String ip ; //IP地址
private Integer port; //端口
private String username;//用户名
private String password;//密码
private String uploadRemotePath; //上传到服务器的路径
private String downloadRemotePath; //从服务器指定路径下载

public SFtpTools() {
super();
}
/**
*
*
@param ip
*
@param port
*
@param username
*
@param password
*
@param uploadRemotePath
*
@param downloadRemotePath
*/
public SFtpTools(String ip, Integer port, String username,String password, String uploadRemotePath,String downloadRemotePath) {
super();
this.ip = ip;
this.port = port;
this.username = username;
this.password = password;
this.uploadRemotePath = uploadRemotePath;
this.downloadRemotePath = downloadRemotePath;
}

public void uploadFiles(File uploadFile) throws JSchException, IOException, SftpException {

logger.info(
"connect to SFTP . ip:" + this.ip + "; port:" + this.port + ";uppath:" + this.uploadRemotePath + ";downpath:" + this.downloadRemotePath+ ";username:" + this.username + ";password:" + this.password);

SFtpClient sFtpClient
= new SFtpClient(ip, port, uploadRemotePath, downloadRemotePath,username, password);
sFtpClient.connect();

// 上传文件
logger.info("sftp sending file....local file path = "+uploadFile.getPath());
sFtpClient.uploadFile(uploadFile);

// 单台链接关闭
sFtpClient.disconnect();

}

/**
* 下载文件到指定的路径
*
@param downloadFile
*
@param remeotFileName 要从服务器获取的文件名称
*
@throws JSchException
*
@throws IOException
*
@throws SftpException
*/
public void downloadFiles(String remeotFileName, File downloadFile) throws JSchException, IOException, SftpException {

logger.info(
"connect to SFTP . ip:" + this.ip + "; port:" + this.port + ";uppath:" + this.uploadRemotePath + ";downpath:" + this.downloadRemotePath+ ";username:" + this.username + ";password:" + this.password);

SFtpClient sFtpClient
= new SFtpClient(ip, port, uploadRemotePath, downloadRemotePath,username, password);
sFtpClient.connect();

// 下载文件
logger.info("sftp receiving file....remote file name = "+remeotFileName);
sFtpClient.downloadFile(remeotFileName,downloadFile);

// 单台链接关闭
sFtpClient.disconnect();

}

public static void main(String[] args) throws IOException {
// SFtpUploadBat sfb = new SFtpUploadBat("10.181.77.68&10.181.68.236", "22&22", "D:\\temp\\", "tepppp/&teppp/",
// "wasadm&wasadm", "wasadm&wasadm");
// try {
// sfb.uploadFiles("helloworld\\");
// } catch (SftpException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (JSchException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}

}

 

sftp上传下载调用

/**
* 上传扣费文件到行方扣费系统
*
@param uploadRemotePath 服务器文件路径
*
@throws Exception
*/
public void uploadFeeFile2Core(String currDate) throws Exception {

String fileName
= FeeSupport.FEE_FILE_UPLOAD_PREFIX+currDate+FeeSupport.FEE_FILE_SUFFIX;
//查询是否需要上传文件
String hql = "from SysFileHandle where fileName = '" + fileName+"' and fileType = '"+FeeSupport.FEE_FILE_TYPE_UPLOAD+"' and handleState != '" + FeeSupport.FEE_FILE_STATE_SUCC + "'";
SysFileHandle fileHandle
= this.fileHandleDao.getFileHandleByUnique(hql);

if(fileHandle!=null){
// 上传
try {
SFtpTools sfb
= new SFtpTools(sftpProperty.getIp(), sftpProperty.getPort(),sftpProperty.getUsername(),sftpProperty.getPassword(),sftpProperty.getUploadRemotePath(),sftpProperty.getDownloadRemotePath());
sfb.uploadFiles(
new
File(sftpProperty.getUploadLocalPath(),fileHandle.getFileName()));

}
catch (Exception e) {
fileHandle.setHandleState(FeeSupport.FEE_FILE_STATE_FAIL);
// 更新记录状态
this.fileHandleDao.updateFileHandle(fileHandle);
throw e;
}

fileHandle.setHandleState(FeeSupport.FEE_FILE_STATE_SUCC);
// 更新记录状态
this.fileHandleDao.updateFileHandle(fileHandle);
}

}
public void downloadFeeFile4Core(String currDate) throws Exception {

String fileName
= FeeSupport.FEE_FILE_DOWNLOAD_PREFIX+currDate+FeeSupport.FEE_FILE_SUFFIX;
//查询是否需要下载文件
String hql = "from SysFileHandle where fileName = '" + fileName+"' and fileType = '"+FeeSupport.FEE_FILE_TYPE_DOWNLOAD + "'";
SysFileHandle fileHandle
= this.fileHandleDao.getFileHandleByUnique(hql);

if(fileHandle != null && currDate.equals(fileHandle.getCreateDate())){
return ;
}

if(fileHandle == null){
fileHandle
= new SysFileHandle();
fileHandle.setFileName(fileName);
fileHandle.setFileType(FeeSupport.FEE_FILE_TYPE_DOWNLOAD );
}
this.downloadFeeFile4Core(fileHandle,currDate,fileName);
}

private void downloadFeeFile4Core( SysFileHandle fileHandle,String currDate,String fileName) throws Exception {

//需要下载
try {
SFtpTools sfb
= new SFtpTools(sftpProperty.getIp(), sftpProperty.getPort(),sftpProperty.getUsername(),sftpProperty.getPassword(),sftpProperty.getUploadRemotePath(),sftpProperty.getDownloadRemotePath());
sfb.downloadFiles(fileName,
new
File(sftpProperty.getDownloadLocalPath(),fileName));

}
catch (Exception e) {

// 更新记录状态
this.fileHandleDao.updateFileHandle(fileHandle);
throw e;
}

fileHandle.setHandleState(FeeSupport.FEE_FILE_STATE_NO);
fileHandle.setCreateDate(currDate);
// 更新记录状态
this.fileHandleDao.updateFileHandle(fileHandle);
}