针对SSH文件传输协议,用jsch上传图片

弄了一整天,终于用jach包实现了一个上传图片的sftp工具类,这个jsch包是针对SSH传输协议的,可以的话把代码copy到IDE上
看比较清晰,下面是代码,休息了!!!

import java.io.InputStream;
import java.io.OutputStream;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

public class SftpUtils {
	/**
	 * 利用JSch包实现SFTP下载、上传文件
	 * @param ip 主机IP
	 * @param username 主机登陆用户名
	 * @param password 主机登陆密码
	 * @param port 主机ssh2登陆端口
	 * @param filePath FTP服务器文件存放路径。例如分日期存放:/2015/01/01。文件的路径为basePath+filePath
	 * @param filename 上传到FTP服务器上的文件名 
	 * @param input 输入流 
	 * @return 成功返回true,否则返回false 
	 */
	public static boolean uploadBySftp(String ip, String username, String password, int port, String basePath, String filePath, String fileName, InputStream is) throws Exception {
		boolean result = false;
		Session session = null;
		Channel channel = null;
		String fullPath = null;

		JSch jsch = new JSch();

		// 采用指定的端口连接服务器
		session = jsch.getSession(username, ip, port);

		// 如果服务器连接不上,则抛出异常
		if (session == null) {
			throw new Exception("session is null");
		}

		// 设置登陆主机的密码
		session.setPassword(password); // 设置密码
		// 设置第一次登陆的时候提示,可选值:(ask | yes | no)
		session.setConfig("StrictHostKeyChecking", "no");
		// 设置登陆超时时间
		session.connect(10000);

		try {
			// 创建sftp通信通道
			channel = (Channel) session.openChannel("sftp");
			channel.connect(1000);
			ChannelSftp sftp = (ChannelSftp) channel;
			
			fullPath = basePath + filePath;
			
			// 判断存放目录是否存在,如不存在就创建目录
			// try {
			// sftp.ls(fullPath);
			// } catch (Exception e) {
			// sftp.mkdir(fullPath);
			// }
		//核心:使用mkdir方法远程创建目录只能一级一级创建,cd方法进入目录会被下一个cd方法的路径覆盖
			//创建目录必须先进入到要创建目录的上一级位置
			//使用JSch远程创建递归目录,最后得到可以直接进入且存放图片的path
			String[] folders = fullPath.split("/");
			//返回的结果数组比预计的数组多了一个元素,第一个元素为空
			System.out.println(folders.length);
			String path = "";
			//第一个元素是空字符串,所以从第二个元素开始遍历,即i=1
			for (int i=1; i<folders.length; i++) {
				String folder = folders[i];
				path = path + "/" + folder;
				try {
					//用是否能进入该目录来判断该目录是否存在
					sftp.cd(path);
				} catch (SftpException e) {
					//上面不能进入则报错,执行以下的创建命令
					sftp.mkdir(path);
				}
			}
			System.out.println(path);
			
			// 进入服务器指定的文件夹
			sftp.cd(path);

			// 以下代码实现从本地上传一个文件到服务器,如果要实现下载,对换以下流就可以了
			OutputStream os = sftp.put(fileName);
			// InputStream instream = new FileInputStream(new
			// File("c:/print.txt"));

			byte b[] = new byte[1024];
			int n;
			while ((n = is.read(b)) != -1) {
				os.write(b, 0, n);
			}
			result = true;
			os.flush();
			os.close();
			is.close();
			return result;
		} catch (Exception e) {
			e.printStackTrace();
			return result;
		} finally {
			session.disconnect();
			channel.disconnect();
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用JSch库实现Java通过SFTP协议上传jar和配置文件到服务器。以下是一个示例代码: ```java import com.jcraft.jsch.*; public class SftpUploader { public static void main(String[] args) { String user = "username"; String password = "password"; String host = "hostname"; int port = 22; String jarFilePath = "path/to/your/jar/file.jar"; String configFilePath = "path/to/your/config/file.properties"; String remoteDir = "/path/to/remote/directory/"; try { JSch jsch = new JSch(); Session session = jsch.getSession(user, host, port); session.setPassword(password); session.setConfig("StrictHostKeyChecking", "no"); session.connect(); Channel channel = session.openChannel("sftp"); channel.connect(); ChannelSftp sftpChannel = (ChannelSftp) channel; sftpChannel.cd(remoteDir); sftpChannel.put(jarFilePath, remoteDir); sftpChannel.put(configFilePath, remoteDir); sftpChannel.exit(); session.disconnect(); System.out.println("Files uploaded successfully."); } catch (JSchException | SftpException e) { e.printStackTrace(); } } } ``` 在这个示例中,我们使用JSch库连接到远程主机,创建一个SFTP通道,并使用put方法将jar文件和配置文件上传到远程目录中。请注意,我们需要提供远程主机的用户名,密码和主机名,以及要上传的jar文件和配置文件的本地路径和远程目录的路径。 你需要将示例中的变量替换为你自己的值,并确保在运行代码时已将JSch库添加到类路径中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值