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 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 GetConfigProperty(String fileName,String...  propName){
		Properties prop = new Properties();  
		Map propMap = new HashMap();
        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 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待续

你可能感兴趣的:(SFTP文件下载、上传)