使用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();


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

下面附上交易源碼

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

/*
 * <p>Title: :BusiWxJSch.java </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2011</p>
 * <p>Company: digitalchina.Ltd</p>
 * @author 
 * Created :2017-11-27 10:58:18
 * @version 1.0
 * ModifyList:
 * <Author> <Time(yyyy/mm/dd)>  <Description>  <Version>
 */




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<HashMap<String,Object>> 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<HashMap<String,Object>> 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<String,Object> paraMap=new HashMap<String,Object>();

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();
}
}




}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章