使用Jsch通过SFTP下载文件

    在项目当中,我用到了Jsch去服务器下载文件,故写此文给大家分享,Jsch功能很多,我只使用到了其中一点,本文只介绍使用Jsch通过SFTP下载文件并且使用了代理。

    在正式说明之前我先大概说下什么是Jsch,Jsch是SSH2的纯java实现,那什么是SSH2呢,SSH有两个不兼容的版本SSH1跟SSH2,那什么是SSH呢,我摘了百度百科中的说明:"SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台—包括HP-UXLinuxAIXSolarisDigital UNIXIrix,以及其他平台,都可运行SSH"。

    1.准备需要的jar包

        jsch-0.1.51.jar

    2.开始编码

        2.1创建Jsch对象

            JSch jsch= new JSch();

        2.2创建Session对象

            Session session=jsch.getSession(String username, String host, int port);

        2.3创建ProxyHTTP 对象

            ProxyHTTP proxyhttp = new ProxyHTTP(String proxy_host, int proxy_port);

        2.4配置session对象参数

            session.setProxy(proxyhttp);
    session.setPassword(String password);//设置SFTP连接时指定用户的密码
    session.setConfig("StrictHostKeyChecking", "no");//取消第一次登陆的时候提示

    session.setTimeout(10000);//设置超时时间

        2.5建立session连接

            session.connect();

        2.6创建sftp通信信道

            channel = (ChannelSftp) session.openChannel("sftp");

    channel.connect();

        2.7进入指定的文件夹,下载指定的文件

            channel.cd(String path);

            channel.get(String src,String dst);//src是源文件的绝对路径包括文件名,dst是指定将源文件下载存放的绝对路径包括文件名

        2.8关闭连接

            if(null!=channel)
channel.disconnect();

    if(null!=session)

            session.disconnect();


-------------------------------------------------------------------------------------------------------------------------------

下面附上交易源码

-------------------------------------------------------------------------------------------------------------------------------

/*
 *

Title: :BusiWxJSch.java


 *

Description:


 *

Copyright: Copyright (c) 2011


 *

Company: digitalchina.Ltd


 * @author 
 * Created :2017-11-27 10:58:18
 * @version 1.0
 * ModifyList:
 *    
 */




package com.dcfs.eci.prod.busi.eod;




import java.io.BufferedReader;




import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;




import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


import com.dc.branch.service.AbstractBusiService;
import com.dc.eai.data.CompositeData;
import com.dc.esb.container.core.data.IServiceDataObject;
import com.dc.esb.container.core.sclite.IBaseContext;
import com.dc.impls.db.DBManagerFactory;
import com.dc.interfaces.db.IDBAction;
import com.dc.interfaces.db.IDBTransaction;
import com.dc.interfaces.db.TransactionException;
import com.dcfs.eci.prod.exception.BusiException;
import com.dcfs.eci.prod.tools.ToolsStrBusi;
import com.dcfs.eci.prod.tools.ftp.FtpConfig;
import com.dcfs.eci.prod.tools.ftp.FtpPoolConfig;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.ProxyHTTP;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;


/**
 * 通过代理实现SFTP下载微信对账文件
 * 
 * @author 
 * @E-Mail 
 */
public class BusiWxJSch extends AbstractBusiService {
private Log log = LogFactory.getLog(BusiWxJSch.class);
private String errorCode=null;


@Override
public IServiceDataObject doExecute(IServiceDataObject sdo,IBaseContext context) {
if (log.isInfoEnabled()) {
log.info("Execute Busi-Service:BusiWxJSch");
}
CompositeData cd = (CompositeData)sdo;

IDBTransaction dbTransaction = null;
IDBAction dbAction = null;
List> list=null;

try {
dbTransaction=super.getDBTransaction();
dbAction=DBManagerFactory.getDBManager().newDBAction("WeChat_Qry_FlowINFO", null);
list=dbTransaction.selectList(dbAction);

if(null==list || list.size()==0){
errorCode = "701590";
throw new BusiException(errorCode);//[统一电子渠道]微信流量充值信息表未配置!
}else{
if(list.get(0).get("END_DATE")!=null){
/**
* 微信流量充值信息表 中END_DATE的格式是yyyy/MM/dd,在Java的时间系统中是yyyy/MM/dd 00:00:00,
* tips:结束时间设置的是2017/11/30 它代表的时间是2017/11/30 00:00:00
* 但正确的时间应该是在2017/11/30 23:59:59之前
* 故获取库中的日期做+1天处理,即表示在2017/12/01 00:00:00 之前
*/
Calendar cal=Calendar.getInstance();
cal.setTime((Date) list.get(0).get("END_DATE"));
if(log.isErrorEnabled())
log.error("数据库中配置的交易截止日期是: "+new SimpleDateFormat("yyyyMMdd").format(cal.getTime()));
cal.add(Calendar.DAY_OF_MONTH, 1);
Date endDate=cal.getTime();
if(log.isErrorEnabled())
log.error("转换后的交易截止日期是:"+new SimpleDateFormat("yyyyMMdd").format(endDate));
if(endDate.before(new Date())){
log.error("[统一电子渠道]流量充值活动已经结束!");
return sdo;
}
}
}

//获取SFTP配置参数
FtpConfig ftpConf=FtpPoolConfig.getFtpConfig("8082");

//使用SFTP下载文件并解析入库
initJsch(ftpConf,list);




} catch (BusiException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
super.closeTransaction();
}
//FIXME Not yet implemented
return sdo;
}

/**

* 通过JSCH使用sftp下载对账文件
*/
public void initJsch(FtpConfig ftpConf,List> list){
JSch jsch= new JSch();
Session session=null;
ChannelSftp channel=null;
try {

/*
* 经过代理创建sftp链接
*/
session = jsch.getSession(ftpConf.getFtpUser(), ftpConf.getFtpHost(), Integer.parseInt(ftpConf.getFtpPort()));
if(log.isErrorEnabled())
log.error("session初始化成功...");
String proxyHost=(String)list.get(0).get("TRANS_IP");
log.error("代理服务器IP是:"+proxyHost);
String proxyPort=(String)list.get(0).get("TRANS_PORT");
log.error("代理服务器端口是:"+proxyPort);
ProxyHTTP proxyhttp = new ProxyHTTP(proxyHost, Integer.parseInt(proxyPort));
session.setProxy(proxyhttp);
session.setPassword(ftpConf.getFtpPwd());
session.setConfig("StrictHostKeyChecking", "no");
session.setTimeout(10000);
session.connect();
if(log.isErrorEnabled())
log.error("session连接成功...");
channel = (ChannelSftp) session.openChannel("sftp");
channel.connect();
if(log.isErrorEnabled())
log.error("sftp连接成功...");
/*
* 下载文件并解析文件的内容
*/
getFile(channel,ftpConf);
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSchException e) {
// TODO Auto-generated catch block
log.error("sftp连接失败...");
e.printStackTrace();
log.info("Jsch连接失败信息是:"+e);
}finally{
if(null!=channel)
channel.disconnect();
if(null!=session)
session.disconnect();
}

}



public void getFile(ChannelSftp channel,FtpConfig ftpConf){
String data=null;
IDBTransaction dbTransaction=null;
Calendar cal =Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH, -1);

//拼装文件名:flowrate_终端号_日期,如flowrate_20151961_20171101
String fileName="flowrate_20151961_"+new SimpleDateFormat("yyyyMMdd").format(cal.getTime());
log.info("文件名:"+fileName);
try {
channel.cd(ftpConf.getFtpTargetDir());
channel.get(ftpConf.getFtpTargetDir()+"/"+fileName, ftpConf.getFtpHomeDir()+"/"+fileName);

File checkFile=new File(ftpConf.getFtpHomeDir()+"/"+fileName);
if(!checkFile.exists()){
log.error("未找到流量对账文件"+ftpConf.getFtpHomeDir()+"/"+fileName+",交易返回....");
return;
}else{
log.error("流量对账文件"+fileName+"下载成功....");
}

if(log.isErrorEnabled())
log.error("开始解析微信对账文件--->"+fileName);
FileInputStream fis=new FileInputStream(ftpConf.getFtpHomeDir()+"/"+fileName);
InputStreamReader isr=new InputStreamReader(fis, "UTF-8");
BufferedReader br =new BufferedReader(isr);
HashMap paraMap=new HashMap();

dbTransaction=DBManagerFactory.getDBManager().newTransaction(false);
while((data = br.readLine())!=null && !data.trim().equals("")){

//数据格式:手机号|交易时间|交易流水(订单号)|销售金额(元)|面值|交易状态|外部流水
String[] result=data.split("\\|");
String phone = result[0];
if(!ToolsStrBusi.isNull(phone))
paraMap.put("CONTACT_INFO", phone.trim());
String status = result[5];
if(!ToolsStrBusi.isNull(status)){
status=status.trim();
paraMap.put("TRAN_STATUS", status);
}
IDBAction dbAction=DBManagerFactory.getDBManager().newDBAction("WeChat_Upd_ClientFlow", paraMap);
dbTransaction.update(dbAction);
}
dbTransaction.commit();


if(checkFile.exists()){
if(checkFile.delete())
log.info("删除动账通知文件"+ftpConf.getFtpHomeDir()+"/"+fileName+"成功...");
}
} catch (SftpException e) {
// TODO Auto-generated catch block
log.error("通过sftp下载微信动账文件失败...");
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransactionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
dbTransaction.close();
}
}




}

你可能感兴趣的:(Java部分,Java,个人拓展)