SFTP檔案下載、上傳
阿新 • • 發佈:2019-02-12
本篇文章介紹,通過SFTP,連線遠端伺服器,並從伺服器上下載檔案。
下載後可以列印,也可以儲存到資料庫。
使用者需要自己手動下載 jsch包。
SFTP工具類
package com.huchi.common.utils.jsch; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Map; import java.util.Properties; import java.util.Vector; import org.apache.log4j.Logger; import com.jcraft.jsch.Channel; 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; /** * @author : lzq * @group : huchi * @Date : 2015-2-26 上午10:13:30 * @Comments : 通過SFTP,讀取資料 * @Version : 1.0.0 */ public class SFTPChannel { Session session = null; Channel channel = null; private static final Logger LOG = Logger.getLogger(SFTPChannel.class); /** * @MethodName : getChannel * @Description : 得到Channel * @param sftpDetails * @param timeout * 超時時間 * @return * @throws JSchException */ public ChannelSftp getChannel(Map<String, String> sftpDetails, int timeout) throws JSchException { String ftpHost = sftpDetails.get(SFTPConstants.SFTP_REQ_HOST); String port = sftpDetails.get(SFTPConstants.SFTP_REQ_PORT); String ftpUserName = sftpDetails.get(SFTPConstants.SFTP_REQ_USERNAME); String ftpPassword = sftpDetails.get(SFTPConstants.SFTP_REQ_PASSWORD); JSch jsch = new JSch(); // 建立JSch物件 session = jsch.getSession(ftpUserName, ftpHost, Integer.parseInt(port)); // 根據使用者名稱,主機ip,埠獲取一個Session物件 LOG.debug("Session created."); if (ftpPassword != null) { session.setPassword(ftpPassword); // 設定密碼 } Properties config = new Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); // 為Session物件設定properties session.setTimeout(timeout); // 設定timeout時間 session.connect(); // 通過Session建立連結 LOG.debug("Session connected."); LOG.debug("Opening Channel."); channel = session.openChannel("sftp"); // 開啟SFTP通道 channel.connect(); // 建立SFTP通道的連線 LOG.debug("Connected successfully to ftpHost = " + ftpHost + ",as ftpUserName = " + ftpUserName + ", returning: " + channel); return (ChannelSftp) channel; } /** * @MethodName : closeChannel * @Description : 關閉channel * @throws Exception */ public void closeChannel() throws Exception { if (channel != null) { channel.disconnect(); } if (session != null) { session.disconnect(); } } /** * @MethodName : getSFTPChannel * @Description : 得到SFTPChannel 類例項物件 * @return */ public SFTPChannel getSFTPChannel() { return new SFTPChannel(); } /** * @MethodName : download * @Description : 下載檔案 * @param directory 下載目錄 * @param downloadFile 下載的檔案 * @param saveFile 存在本地的路徑 * @param sftp */ public void download(String directory, String downloadFile, String saveFile, ChannelSftp sftp) { try { sftp.cd(directory); File file = new File(saveFile); sftp.get(downloadFile, new FileOutputStream(file)); } catch (Exception e) { e.printStackTrace(); } } /** * @MethodName : upload * @Description : 上傳檔案 * @param directory 上傳的目錄 * @param uploadFile 要上傳的檔案 * @param sftp */ public void upload(String directory, String uploadFile, ChannelSftp sftp) { try { sftp.cd(directory); File file = new File(uploadFile); sftp.put(new FileInputStream(file), file.getName()); } catch (Exception e) { e.printStackTrace(); } } /** * @MethodName : delete * @Description : 刪除檔案 * @param directory 要刪除檔案所在目錄 * @param deleteFile 要刪除的檔案 * @param sftp */ public void delete(String directory, String deleteFile, ChannelSftp sftp) { try { sftp.cd(directory); sftp.rm(deleteFile); } catch (Exception e) { e.printStackTrace(); } } /** * @MethodName : listFiles * @Description : 列出目錄下的檔案 * @param directory 要列出的目錄 * @param sftp sftp * @return * @throws SftpException */ public Vector listFiles(String directory, ChannelSftp sftp) throws SftpException { return sftp.ls(directory); } }
讀取配置檔案工具類
public class BackendUtils { /** * @MethodName : GetConfigProperty * @Description : 去讀配置檔案中的property屬性 * @param fileName 配置檔名稱 * @param propName 獲取的屬性 * @return propMap */ public static Map<String, String> GetConfigProperty(String fileName,String... propName){ Properties prop = new Properties(); Map<String, String> propMap = new HashMap<String, String>(); try { prop.load(BackendUtils.class.getClassLoader().getResourceAsStream(fileName)); for (String propery : propName) { propMap.put(propery, prop.getProperty(propery)); } } catch(IOException e) { e.printStackTrace(); } return propMap; } }
測試
public static void main(String[] args) throws Exception { // 設定主機ip,埠,使用者名稱,密碼 Map<String, String> sftpDetails = BackendUtils.GetConfigProperty( "property/account.properties", SFTPConstants.SFTP_REQ_HOST, SFTPConstants.SFTP_REQ_USERNAME, SFTPConstants.SFTP_REQ_PASSWORD, SFTPConstants.SFTP_REQ_PORT, SFTPConstants.SFTP_PARTNER); SFTPChannel channel = new SFTPChannel(); ChannelSftp chSftp = channel.getChannel(sftpDetails, 60000); // 獲取昨天 Calendar cal = Calendar.getInstance(); cal.add(Calendar.DATE, -1); String yesterday = new SimpleDateFormat("yyyyMMdd").format(cal.getTime()); // 昨天 //連連檔案目錄 String directory = "/bjmx/"+sftpDetails.get(SFTPConstants.SFTP_PARTNER)+"/"; //連連交易記錄檔案 String downloadFile = "JYMX_"+sftpDetails.get(SFTPConstants.SFTP_PARTNER)+"_"+yesterday+".txt"; //儲存本地的檔案全路徑 String saveFile = "D:\\lianTradeRecord\\JYMX_"+sftpDetails.get(SFTPConstants.SFTP_PARTNER)+"_"+yesterday+".txt"; //下載檔案 channel.download(directory, downloadFile, saveFile, chSftp); //中文正則表示式 String regEx = "[\\u4e00-\\u9fa5]"; Pattern p = Pattern.compile(regEx); try { BufferedReader br = new BufferedReader(new FileReader(saveFile)); String str; while ((str = br.readLine()) != null) { Matcher m = p.matcher(str.substring(0, 1)); if (m.find()) { continue; } String[] rows = str.split(","); for (String row : rows) { System.out.println(row); } } } catch (Exception e) { e.printStackTrace(); } finally { chSftp.quit(); channel.closeChannel(); } }
系統常量
/**
* @author : lzq
* @group : huchi
* @Date : 2015-2-27 下午2:28:46
* @Comments : sftp檔案下載常量
* @Version : 1.0.0
*/
public class SFTPConstants {
public static final String SFTP_REQ_HOST = "host"; //IP地址
public static final String SFTP_REQ_PORT = "port"; //埠
public static final String SFTP_REQ_USERNAME = "username";
public static final String SFTP_REQ_PASSWORD = "password";
public static final String SFTP_PARTNER = "partner"; //商戶號
}
配置檔案資訊:account.properties
host=115.238.110.126
username=root
password=root123
port=20
partner=5413165
df待續