jsch 实现 文件上传

 

maven导入

 

<dependency>

<groupId>com.jcraft</groupId>

<artifactId>jsch</artifactId>

<version>0.1.53</version>

</dependency>

工具类

​
package com.yj.tr.ch.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Iterator;
import java.util.Properties;
import java.util.Vector;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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;
import com.yj.tr.ch.context.ChSContext;
import com.yj.tr.resource.update.ResourceUpdateContext;

/***
 * 使用jsch进行文件上传 <br >
 * ClassName: RemoteShellUtils
 * 
 * @author XuL
 * @date 2018年9月29日
 */
public class RemoteShellUtils {

	private static final Logger LOGGER = LoggerFactory.getLogger(RemoteShellUtils.class);

	private static Session session = null;
	private static Channel channel = null;
	private static ChannelSftp sftp = null;

	/***
	 * 创建session 得到session连接
	 * 
	 * @return
	 */
	private static Session getSession() throws Exception {
		LOGGER.info("start create session ");
		JSch jsch = new JSch();

		session = jsch.getSession(ChSContext.getContext().getString(ResourceUpdateContext.RESOURCE1_SERVER_USER),
				ChSContext.getContext().getString(ResourceUpdateContext.RESOURCE1_SERVER_HOST),
				Integer.parseInt(ChSContext.getContext().getString(ResourceUpdateContext.RESOURCE1_SERVER_PORT)));

		session.setPassword(ChSContext.getContext().getString(ResourceUpdateContext.RESOURCE1_SERVER_PASSWORD));

		Properties config = new Properties();

		config.put("StrictHostKeyChecking", "no"); // 不验证 HostKey

		session.setConfig(config);

		try {
			session.connect();
		} catch (Exception e) {
			if (session.isConnected()) {
				session.disconnect();
			}
			LOGGER.error(
					"连接服务器失败,请检查主机[" + ChSContext.getContext().getString(ResourceUpdateContext.RESOURCE1_SERVER_HOST)
							+ "],端口[" + ChSContext.getContext().getString(ResourceUpdateContext.RESOURCE1_SERVER_PORT)
							+ "],用户名[" + ChSContext.getContext().getString(ResourceUpdateContext.RESOURCE1_SERVER_USER)
							+ "]]是否正确,以上信息正确的情况下请检查网络连接是否正常或者请求被防火墙拒绝.",
					e);
			return null;
		}
		return session;
	}

	/**
	 * 创建ChannelExec
	 * 
	 * @return
	 * @throws JSchException
	 */
	private static Channel getChannel() throws Exception {
		LOGGER.info("start create channel ");
		if (session == null) {
			session = getSession();
		}
		if (channel == null) {
			channel = session.openChannel("sftp");
		}

		try {
			channel.connect();
		} catch (Exception e) {
			if (channel.isConnected())
				channel.disconnect();
			LOGGER.error(
					"连接服务器失败,请检查主机[" + ChSContext.getContext().getString(ResourceUpdateContext.RESOURCE1_SERVER_HOST)
							+ "],端口[" + ChSContext.getContext().getString(ResourceUpdateContext.RESOURCE1_SERVER_PORT)
							+ "],用户名[" + ChSContext.getContext().getString(ResourceUpdateContext.RESOURCE1_SERVER_USER)
							+ "]]是否正确,以上信息正确的情况下请检查网络连接是否正常或者请求被防火墙拒绝.",
					e);
			return null;
		}

		if (sftp == null) {
			sftp = (ChannelSftp) channel;
		}
		return channel;
	}

	/**
	 * 断开连接
	 * 
	 */
	private static void disConn() throws Exception {
		if (null != sftp) {
			LOGGER.info("disable sftp  ");
			sftp.disconnect();
			sftp.exit();
			sftp = null;
		}
		if (null != channel) {
			LOGGER.info("disable channel  ");
			channel.disconnect();
			channel = null;
		}
		if (null != session) {
			LOGGER.info("disable session  ");
			session.disconnect();
			session = null;
		}
	}

	/**
	 * 上传文件
	 * 
	 * @param directory  上传的目录-相对于SFPT设置的用户访问目录, 为空则在SFTP设置的根目录进行创建文件(除设置了服务器全磁盘访问)
	 * @param uploadFile 要上传的文件全路径
	 */
	public static boolean upload(String directory, String uploadFile) throws Exception {
		channel = getChannel();
		if (channel == null || session == null || sftp == null) {
			return false;
		}

		try {
			try {
				sftp.cd(directory); // 进入目录
			} catch (SftpException sException) {
				if (sftp.SSH_FX_NO_SUCH_FILE == sException.id) { // 指定上传路径不存在
					sftp.mkdir(directory);// 创建目录
					sftp.cd(directory); // 进入目录
				}
			}

			File file = new File(uploadFile);
			InputStream in = new FileInputStream(file);

			sftp.put(in, file.getName());
			in.close();

		} catch (Exception e) {
			throw new Exception(e.getMessage(), e);
		} finally {
			disConn();
		}

		return true;

	}

	/***
	 * 检查文件是否存在
	 * 
	 * @param directory 文件在服务器的路径
	 * @param fileName  文件名称
	 */
	public static boolean checkFile(String directory, String fileName) throws Exception {
		LOGGER.info("check is have File  {} {}", directory, fileName);
		boolean isHave = false;
		try {
			if (session == null) {
				channel = getChannel();
			}

			// 得到所有文件名
			try {
				sftp.cd(directory); // 进入目录
			} catch (SftpException sException) {
				if (sftp.SSH_FX_NO_SUCH_FILE == sException.id) { // 指定上传路径不存在
					sftp.mkdir(directory);// 创建目录
					sftp.cd(directory); // 进入目录
				}
			}

			// 得到所有文件
			Vector filesName = sftp.ls(directory);

			Iterator it = filesName.iterator();

			while (it.hasNext()) {
				String nameString = ((ChannelSftp.LsEntry) it.next()).getFilename();
				if (".".equals(nameString) || "..".equals(nameString)) {
					continue;
				}

				if (fileName.equals(nameString)) {
					isHave = true;
				}
			}
		} catch (Exception e) {
			throw new Exception(e.getMessage(), e);
		} finally {
			disConn();
		}

		return isHave;

	}

}

​

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值