sftp文件上传下载

package com.taikang.ftp;
 
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Vector;

import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.ChannelSftp.LsEntry;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
 
public class SFTPUtil {
	private static final Logger log = LoggerFactory.getLogger(SFTPUtil.class);
 
	private ChannelSftp sftp;
 
	private Session session;
	/** FTP 登录用户名 */
	private String username;
	/** FTP 登录密码 */
	private String password;
	/** 私钥 */
	private String privateKey;
	/** FTP 服务器地址IP地址 */
	private String host;
	/** FTP 端口 */
	private int port;
 
	/**
	 * 构造基于密码认证的sftp对象
	 * 
	 * @param userName
	 * @param password
	 * @param host
	 * @param port
	 */
	public SFTPUtil(String username, String password, String host, int port) {
		this.username = username;
		this.password = password;
		this.host = host;
		this.port = port;
	}
 
	/**
	 * 构造基于秘钥认证的sftp对象
	 * 
	 * @param userName
	 * @param host
	 * @param port
	 * @param privateKey
	 */
	public SFTPUtil(String username, String host, int port, String privateKey) {
		this.username = username;
		this.host = host;
		this.port = port;
		this.privateKey = privateKey;
	}
 
	public SFTPUtil() {
	}
 
	/**
	 * 连接sftp服务器
	 * 
	 * @throws Exception
	 */
	public void login() {
		try {
			JSch jsch = new JSch();
			if (privateKey != null) {
				jsch.addIdentity(privateKey);// 设置私钥
				log.info("sftp connect,path of private key file:{}", privateKey);
			}
			log.info("sftp connect by host:{} username:{}", host, username);
 
			session = jsch.getSession(username, host, port);
			log.info("Session is build");
			if (password != null) {
				session.setPassword(password);
			}
			Properties config = new Properties();
			config.put("StrictHostKeyChecking", "no");
 
			session.setConfig(config);
			session.connect();
			log.info("Session is connected");
 
			Channel channel = session.openChannel("sftp");
			channel.connect();
			log.info("channel is connected");
 
			sftp = (ChannelSftp) channel;
			log.info(String.format("sftp server host:[%s] port:[%s] is connect successfull", host, port));
		} catch (JSchException e) {
			log.error("Cannot connect to specified sftp server : {}:{} \n Exception message is: {}",
					new Object[] { host, port, e.getMessage() });
		}
	}
 
	/**
	 * 关闭连接 server
	 */
	public void logout() {
		if (sftp != null) {
			if (sftp.isConnected()) {
				sftp.disconnect();
				log.info("sftp is closed already");
			}
		}
		if (session != null) {
			if (session.isConnected()) {
				session.disconnect();
				log.info("sshSession is closed already");
			}
		}
	}
 
	/**
	 * 将输入流的数据上传到sftp作为文件
	 * 
	 * @param directory
	 *            上传到该目录
	 * @param sftpFileName
	 *            sftp端文件名
	 * @param in
	 *            输入流
	 * @throws SftpException
	 * @throws Exception
	 */
	public void upload(String directory, String sftpFileName, InputStream input) throws SftpException {
		try {
			sftp.cd(directory);
		} catch (SftpException e) {
			log.warn("directory is not exist");
			sftp.mkdir(directory);
			sftp.cd(directory);
		}
		sftp.put(input, sftpFileName);
		log.info("file:{} is upload successful", sftpFileName);
	}
 
	/**
	 * 上传单个文件
	 * 
	 * @param directory
	 *            上传到sftp目录
	 * @param uploadFile
	 *            要上传的文件,包括路径
	 * @throws FileNotFoundException
	 * @throws SftpException
	 * @throws Exception
	 */
	public void upload(String directory, String uploadFile) throws FileNotFoundException, SftpException {
		File file = new File(uploadFile);
		upload(directory, file.getName(), new FileInputStream(file));
	}
 
	/**
	 * 将byte[]上传到sftp,作为文件。注意:从String生成byte[]是,要指定字符集。
	 * 
	 * @param directory
	 *            上传到sftp目录
	 * @param sftpFileName
	 *            文件在sftp端的命名
	 * @param byteArr
	 *            要上传的字节数组
	 * @throws SftpException
	 * @throws Exception
	 */
	public void upload(String directory, String sftpFileName, byte[] byteArr) throws SftpException {
		upload(directory, sftpFileName, new ByteArrayInputStream(byteArr));
	}
	
	public void batchupload(String localdirectory,String remotedirectory) throws Exception {
		File file=new File(localdirectory);
		if(file.isDirectory()) {
			for(File f:file.listFiles()) {
				List<String> nameList=new ArrayList<>();
				String filename=f.getName();
				try {
					sftp.cd(remotedirectory);
					 Vector vector=sftp.ls(remotedirectory);
					 for(Object obj:vector) {
						 if(obj instanceof LsEntry) {
							 String sftpFileName=((LsEntry)obj).getFilename();
							 if(sftpFileName.indexOf(".")>0) {
								 nameList.add(sftpFileName);
							 }
						 }
					 }
					if(nameList.size()>0) {
						if(!nameList.contains(filename)) {
							FileInputStream srcFile=new FileInputStream(f);
							sftp.put(srcFile, filename);
						}
					}else {
						FileInputStream srcFile=new FileInputStream(f);
						sftp.put(srcFile, filename);
					}
					
				} catch (SftpException e) {
					sftp.mkdir(remotedirectory);
					sftp.cd(remotedirectory);
					FileInputStream srcFile=new FileInputStream(f);
					sftp.put(srcFile, remotedirectory+filename);
				}
				
			}
		}else {
			sftp.cd(remotedirectory);
			FileInputStream srcFile=new FileInputStream(file);
			sftp.put(srcFile, remotedirectory+File.separatorChar+file.getName());
		}
	}
 
	/**
	 * 将字符串按照指定的字符编码上传到sftp
	 * 
	 * @param directory
	 *            上传到sftp目录
	 * @param sftpFileName
	 *            文件在sftp端的命名
	 * @param dataStr
	 *            待上传的数据
	 * @param charsetName
	 *            sftp上的文件,按该字符编码保存
	 * @throws UnsupportedEncodingException
	 * @throws SftpException
	 * @throws Exception
	 */
	public void upload(String directory, String sftpFileName, String dataStr, String charsetName)
			throws UnsupportedEncodingException, SftpException {
		upload(directory, sftpFileName, new ByteArrayInputStream(dataStr.getBytes(charsetName)));
	}
 
	/**
	 * 下载文件
	 * 
	 * @param directory
	 *            下载目录
	 * @param downloadFile
	 *            下载的文件
	 * @param saveFile
	 *            存在本地的路径
	 * @throws SftpException
	 * @throws FileNotFoundException
	 * @throws Exception
	 */
	public void download(String directory, String downloadFile, String saveFile)
			throws SftpException, FileNotFoundException {
		if (directory != null && !"".equals(directory)) {
			sftp.cd(directory);
		}
		File file = new File(saveFile);
		sftp.get(downloadFile, new FileOutputStream(file));
		log.info("file:{} is download successful", downloadFile);
	}
	
	/**
	 * 
	 * <p>Title: batchdownload</p>  
	 * <p>Description: </p>  
	 * @param directory  sftp上的文件夹名
	 * @param savedirectory 本地文件夹名
	 * @throws SftpException
	 * @throws IOException
	 */
	public void batchdownload(String directory,String savedirectory) throws SftpException, IOException {
		if (directory != null && !"".equals(directory)) {
			sftp.cd(directory);
		}
		 Vector<?> vector=listFiles(directory);
		 for(Object obj:vector) {
			 if(obj instanceof LsEntry) {
				 String downloadfilename=((LsEntry)obj).getFilename();
				 if(downloadfilename.indexOf(".")>0) {
					 File savefile = new File(savedirectory+File.separatorChar+downloadfilename);
					 sftp.get(downloadfilename, new FileOutputStream(savefile));
				 }
				
			 }
		 }
		 
	}
 
	/**
	 * 下载文件
	 * 
	 * @param directory
	 *            下载目录
	 * @param downloadFile
	 *            下载的文件名
	 * @return 字节数组
	 * @throws SftpException
	 * @throws IOException
	 * @throws Exception
	 */
	public byte[] download(String directory, String downloadFile) throws SftpException, IOException {
		if (directory != null && !"".equals(directory)) {
			sftp.cd(directory);
		}
		InputStream is = sftp.get(downloadFile);
 
		byte[] fileData = IOUtils.toByteArray(is);
 
		log.info("file:{} is download successful", downloadFile);
		return fileData;
	}
	
	
 
	/**
	 * 删除文件
	 * 
	 * @param directory
	 *            要删除文件所在目录
	 * @param deleteFile
	 *            要删除的文件
	 * @throws SftpException
	 * @throws Exception
	 */
	public void delete(String directory, String deleteFile) throws SftpException {
		sftp.cd(directory);
		sftp.rm(deleteFile);
	}
 
	/**
	 * 列出目录下的文件
	 * 
	 * @param directory
	 *            要列出的目录
	 * @param sftp
	 * @return
	 * @throws SftpException
	 */
	public Vector<?> listFiles(String directory) throws SftpException {
		return sftp.ls(directory);
	}
 
	public static void main(String[] args) throws Exception {
		SFTPUtil sftp = new SFTPUtil("admin", "admin", "127.0.0.1", 60000);
		sftp.login();
		// byte[] buff = sftp.download("/opt", "start.sh");
		// System.out.println(Arrays.toString(buff));
//		File file = new File("D:\\1.pdf");
//		InputStream is = new FileInputStream(file);
//
//		sftp.upload("2", "2.pdf", is);
		//sftp.download("2", "2.pdf", "d://3.pdf");
//		byte[] buff=sftp.download("2", "3.pdf");
//		File file=new File("d://4.pdf");
//		FileOutputStream fos=new FileOutputStream(file);
//		fos.write(buff);
//		fos.close();
//		sftp.batchdownload("/2", "D:/3/");
		sftp.batchupload("D:/3/", "/3");
		sftp.logout();
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值