1. 程式人生 > >SFTP檔案下載、上傳

SFTP檔案下載、上傳

本篇文章介紹,通過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待續