通过JSch编写上传下载文件

Posted hct118

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过JSch编写上传下载文件相关的知识,希望对你有一定的参考价值。

package com.hct.util;

/**
 * @作者: HCT
 * @时间:2016年12月29日下午3:13:20
 * @描述:
 *
 */
import java.io.*;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.jcraft.jsch.*;

public class UpAndDownFileSftp {
	/**
	 * 利用JSch包实现SFTP下载、上传文件(用户名密码方式登陆)
	 * @param ip 主机IP
	 * @param user 主机登陆用户名
	 * @param psw  主机登陆密码
	 * @param port 主机ssh2登陆端口,如果取默认值(默认值22),传-1
	 * 
	 */
	public Session connect(String ip, int port,String user, String psw ) throws Exception{
		System.out.println("开始用户名密码方式登陆");
		Session session = null;
		
		JSch jsch = new JSch();
		
		if(port <=0){
			//连接服务器,采用默认端口
			session = jsch.getSession(user, ip);
		}else{
			//采用指定的端口连接服务器
			session = jsch.getSession(user, ip ,port);
		}

		//如果服务器连接不上,则抛出异常
		if (session == null) {
			throw new Exception("session is null");
		}
		
		//设置登陆主机的密码
		session.setPassword(psw);//设置密码   
		//设置第一次登陆的时候提示,可选值:(ask | yes | no)
		session.setConfig("StrictHostKeyChecking", "no");
		//设置登陆超时时间   
		session.connect(30000);
		
		return session;
			
	}
	
	/**  
	* @Title: sftpUpLoadFile  
	* @Description: 上傳指定目錄下面的指定文件到遠程指定目錄  
	* @param uploadFileName----上傳到遠程指定文件夾下面文件的名字,eg,uploadFileName="trade_balance_file_20161220_301.txt"; 
	* @param uploadfilepath----上傳到遠程指定文件夾名,eg,uploadfilepath="/alidata1/6080/share/20161222/301";
	* @param uploadfile----要從本地什麼文件夾及文件名上傳,eg,uploadfile="C:/Users/hechangting/Desktop/file/trade_balance_file_20161220_301.txt";
	* @return void    返回类型  
	* @throws  
	*/
	public  void sftpUpLoadFile(Session session, String uploadFileName,String uploadfilepath,String uploadfile) throws Exception {
		Channel channel = null;
		try {
			//创建sftp通信通道
			channel = (Channel) session.openChannel("sftp");
			channel.connect(1000);
			ChannelSftp sftp = (ChannelSftp) channel;
			
			
			//进入服务器指定的文件夹
			sftp.cd(uploadfilepath);
			
			//列出服务器指定的文件列表
			Vector v = sftp.ls("*.txt");
			for(int i=0;i<v.size();i++){
				System.out.println(v.get(i));
			}
			
			//以下代码实现从本地上传一个文件到服务器,如果要实现下载,对换以下流就可以了
			OutputStream outstream = sftp.put(uploadFileName);
			InputStream instream = new FileInputStream(new File(uploadfile));
			
			byte b[] = new byte[1024];
			int n;
		    while ((n = instream.read(b)) != -1) {
		    	outstream.write(b, 0, n);
		    }
		    System.out.println("上傳文件==="+uploadFileName+"成功");
		    outstream.flush();
		    outstream.close();
		    instream.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			session.disconnect();
			channel.disconnect();
		}
	}
	
	/**  
	* @Title: sftpDownLoadFile  
	* @Description: 下載指定目錄下面的指定文件 
	* @param downloadFileName----要把文件下載到本地什麼地方、名字叫什麼,eg,downloadFileName="C:/Users/hechangting/Desktop/file/hhhhh.txt"; 
	* @param downloadfilepath----要從遠程什麼目錄下面下載文件,eg,downloadfilepath="/alidata1/6080/share/20161222/301"; 
	* @param downloadfile----要從遠程什麼目錄下面下載的文件的名字,eg,downloadfile="redemption_balance_confirm_file_20161222_301.txt";
	* @return void    返回类型  
	* @throws  
	*/
	public void sftpDownLoadFile(Session session, String downloadFileName,
			String downloadfilepath, String downloadfile) throws Exception {
		Channel channel = null;
		try {
			// 创建sftp通信通道
			channel = (Channel) session.openChannel("sftp");
			channel.connect(1000);
			ChannelSftp sftp = (ChannelSftp) channel;

			// 进入服务器指定的文件夹
			sftp.cd(downloadfilepath);

			// 列出服务器指定的文件列表
			Vector v = sftp.ls("*.txt");
			for (int i = 0; i < v.size(); i++) {
				System.out.println(v.get(i));
			}

			// 以下代码实现从本地上传一个文件到服务器,如果要实现下载,对换以下流就可以了
			InputStream instream = sftp.get(downloadfile);
			OutputStream outstream = new FileOutputStream(new File(
					downloadFileName));

			byte b[] = new byte[1024];
			int n;
			while ((n = instream.read(b)) != -1) {
				outstream.write(b, 0, n);
			}
			System.out.println("下載文件" + downloadfile + "成功!");
			outstream.flush();
			outstream.close();
			instream.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			session.disconnect();
			channel.disconnect();
		}
	}
}

  

测试代码

package com.hct.util;

import com.jcraft.jsch.Session;

/**
 * @作者: HCT
 * @时间:2016年12月29日下午3:49:25
 * @描述:
 *
 */
public class TestUPandDownFile {

	/**  
	 * @Title: main  
	 * @Description: TODO(这里用一句话描述这个方法的作用)  
	 * @param 参数描述  
	 * @return void    返回类型  
	 * @throws  
	 */
	public static void main(String[] args) throws Exception {
		String ip="10.139.108.102";
		int port=22;
		String user="6080";
		String psw="6080";
		Session session = null;
		String uploadFileName="trade_balance_file_20161220_301.txt";
		UpAndDownFileSftp upanddownfile = new UpAndDownFileSftp();
		session = upanddownfile.connect(ip, port, user, psw);
		
		String uploadfilepath="/alidata1/6080/share/20161222/301";
		String uploadfile="C:/Users/hechangting/Desktop/file/trade_balance_file_20161220_301.txt";
//		upanddownfile.sftpUpLoadFile(session, uploadFileName, uploadfilepath, uploadfile);
		
		
		
		String downloadFileName="C:/Users/hechangting/Desktop/file/hhhhh.txt";
		String downloadfilepath="/alidata1/6080/share/20161222/301/";
		String downloadfile="redemption_balance_confirm_file_20161222_301.txt";
//		upanddownfile.sftpDownLoadFile(session, downloadFileName, downloadfilepath, downloadfile);
		
		String downloadDirectorypath="/alidata1/6080/share/20161222/301/";
		String downloadLocalDirectorypath="C:/Users/hechangting/Desktop/file/";
		upanddownfile.sftpDownLoadDirectory(session, downloadDirectorypath, downloadLocalDirectorypath);
		
	}

}

  

以上是关于通过JSch编写上传下载文件的主要内容,如果未能解决你的问题,请参考以下文章

Java利用JSch实现sftp通过ssh上传下载删除文件及配置代码

Java通过ssh向服务器上传下载删除文件和操作Linux

JSch - Java实现的SFTP(文件下载详解篇)

JSCH实现文件上传的代码实例

JSCH实现文件上传下载至sftp服务器

通过 JSch 建立 SSH 隧道