packagecom.app.pt.backup.util;importjava.io.File;importjava.io.FileInputStream;importjava.io.InputStream;importjava.io.UnsupportedEncodingException;importjava.util.Iterator;importjava.util.Vector;importorg.apache.commons.logging.Log;importorg.apache.commons.logging.LogFactory;importcom.app.common.util.FileUtil;importcom.jcraft.jsch.ChannelSftp;importcom.jcraft.jsch.ChannelSftp.LsEntry;importcom.jcraft.jsch.JSch;importcom.jcraft.jsch.JSchException;importcom.jcraft.jsch.Session;importcom.jcraft.jsch.SftpException;/*** SFTP帮助类
*@authorwangbailin
**/
public classSFTPUtil {private static Log log = LogFactory.getLog(SFTPUtil.class);/*** 连接sftp服务器
*@paramhost 远程主机ip地址
*@paramport sftp连接端口,null 时为默认端口
*@paramuser 用户名
*@parampassword 密码
*@return*@throwsJSchException*/
public static Session connect(String host, Integer port, String user, String password) throwsJSchException{
Session session= null;try{
JSch jsch= newJSch();if(port != null){
session=jsch.getSession(user, host, port.intValue());
}else{
session=jsch.getSession(user, host);
}
session.setPassword(password);//设置第一次登陆的时候提示,可选值:(ask | yes | no)
session.setConfig("StrictHostKeyChecking", "no");//30秒连接超时
session.connect(30000);
}catch(JSchException e) {
e.printStackTrace();
System.out.println("SFTPUitl 获取连接发生错误");throwe;
}returnsession;
}/*** sftp上传文件(夹)
*@paramdirectory
*@paramuploadFile
*@paramsftp
*@throwsException*/
public static void upload(String directory, String uploadFile, ChannelSftp sftp) throwsException{
System.out.println("sftp upload file [directory] : "+directory);
System.out.println("sftp upload file [uploadFile] : "+uploadFile);
File file= newFile(uploadFile);if(file.exists()){//这里有点投机取巧,因为ChannelSftp无法去判读远程linux主机的文件路径,无奈之举
try{
Vector content=sftp.ls(directory);if(content == null){
sftp.mkdir(directory);
}
}catch(SftpException e) {
sftp.mkdir(directory);
}//进入目标路径
sftp.cd(directory);if(file.isFile()){
InputStream ins= newFileInputStream(file);//中文名称的
sftp.put(ins, new String(file.getName().getBytes(),"UTF-8"));//sftp.setFilenameEncoding("UTF-8");
}else{
File[] files=file.listFiles();for(File file2 : files) {
String dir=file2.getAbsolutePath();if(file2.isDirectory()){
String str=dir.substring(dir.lastIndexOf(file2.separator));
directory= FileUtil.normalize(directory +str);
}
upload(directory,dir,sftp);
}
}
}
}/*** sftp下载文件(夹)
*@paramdirectory 下载文件上级目录
*@paramsrcFile 下载文件完全路径
*@paramsaveFile 保存文件路径
*@paramsftp ChannelSftp
*@throwsUnsupportedEncodingException*/
public static void download(String directory,String srcFile, String saveFile, ChannelSftp sftp) throwsUnsupportedEncodingException {
Vector conts= null;try{
conts=sftp.ls(srcFile);
}catch(SftpException e) {
e.printStackTrace();
log.debug("ChannelSftp sftp罗列文件发生错误",e);
}
File file= newFile(saveFile);if(!file.exists()) file.mkdir();//文件
if(srcFile.indexOf(".") > -1){try{
sftp.get(srcFile, saveFile);
}catch(SftpException e) {
e.printStackTrace();
log.debug("ChannelSftp sftp下载文件发生错误",e);
}
}else{//文件夹(路径)
for (Iterator iterator =conts.iterator(); iterator.hasNext();) {
LsEntry obj=(LsEntry) iterator.next();
String filename= new String(obj.getFilename().getBytes(),"UTF-8");if(!(filename.indexOf(".") > -1)){
directory= FileUtil.normalize(directory + System.getProperty("file.separator") +filename);
srcFile=directory;
saveFile= FileUtil.normalize(saveFile + System.getProperty("file.separator") +filename);
}else{//扫描到文件名为".."这样的直接跳过
String[] arrs = filename.split("\\.");if((arrs.length > 0) && (arrs[0].length() > 0)){
srcFile= FileUtil.normalize(directory + System.getProperty("file.separator") +filename);
}else{continue;
}
}
download(directory, srcFile, saveFile, sftp);
}
}
}
}