javaweb上传文件到服务器中

   项目中经常要做上传功能,除了页面使用上传组件外,后台的文件处理一种是 存放在项目中文件夹,另一种存放部署的服务器中,后一种更灵活对项目更友好。

JSch是Java Secure Channel的缩写。 JSch是一个SSH2的纯Java实现。它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到你自己的应用程序。
  本文只介绍如何使用JSch实现的SFTP功能。
  SFTP是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。SFTP 为 SSH的一部份,是一种传输文件到服务器的安全方式。SFTP是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。(来自百度的解释)  
  要使用JSch,需要下载它的jar包,请从官网下载它:http://www.jcraft.com/jsch/
 
ChannelSftp类是JSch实现SFTP核心类,它包含了所有SFTP的方法,如:
put():      文件上传
get():      文件下载
cd():       进入指定目录
ls():       得到指定目录下的文件列表
rename():   重命名指定文件或目录
rm():       删除指定文件
mkdir():    创建目录
rmdir():    删除目录

以下是stfpUtils工具类的方法
package com.pzedu.infrastructure.common.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Properties;
import java.util.Vector;

import org.apache.commons.lang3.StringUtils;
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.Session;
import com.jcraft.jsch.SftpException;

/**
 * sftp 工具类
 * 
 * @author weird
 */
public final class Sftps {

	private static final Logger log = LoggerFactory.getLogger(Sftps.class);
	
	private Session sshSession;
	
	private ChannelSftp sftp;
	
	/**
	 * 连接sftp服务器
	 * @param host
	 * @param port
	 * @param username
	 * @param password
	 * @return
	 * @throws Exception
	 */
	public ChannelSftp connect(String host, int port, String username, String password) throws Exception {
		JSch jsch = new JSch();
		sshSession = jsch.getSession(username, host, port);
		
		log.debug("Session created.");
		
		sshSession.setPassword(password);
		Properties sshConfig = new Properties();
		sshConfig.put("StrictHostKeyChecking", "no");
		sshSession.setConfig(sshConfig);
		sshSession.connect();
		
		log.debug("Session connected.");
		log.debug("Opening Channel.");
		
		Channel channel = sshSession.openChannel("sftp");
		channel.connect();
		sftp = (ChannelSftp) channel;
		
		log.debug("Connected to " + host + ".");
		
		return sftp;
	}
	/**
	 * 连接sftp服务器
	 * @param host
	 * @param port
	 * @param username
	 * @param privateKey
	 * @param passphrase
	 * @return
	 * @throws Exception 
	 */
	public ChannelSftp connect(String host, int port, String username, String privateKey ,String passphrase) throws Exception {
		JSch jsch = new JSch();
		
		//设置密钥和密码
	    if (!StringUtils.isEmpty(privateKey)) {
	        if (!StringUtils.isEmpty(passphrase)) {
	            //设置带口令的密钥
	            jsch.addIdentity(privateKey, passphrase);
	        } else {
	            //设置不带口令的密钥
	            jsch.addIdentity(privateKey);
	        }
	    }
		sshSession = jsch.getSession(username, host, port);
		
		log.debug("Session created.");
		
		Properties sshConfig = new Properties();
		sshConfig.put("StrictHostKeyChecking", "no");
		sshSession.setConfig(sshConfig);
		sshSession.connect();
		
		log.debug("Session connected.");
		log.debug("Opening Channel.");
		
		Channel channel = sshSession.openChannel("sftp");
		channel.connect();
		sftp = (ChannelSftp) channel;
		
		log.debug("Connected to " + host + ".");
		
		return sftp;
	}
	
	public void portForwardingL(int lport, String rhost, int rport) throws Exception {
		int assinged_port = sshSession.setPortForwardingL(lport, rhost, rport);
	    System.out.println("localhost:"+assinged_port+" -> "+rhost+":"+rport);
	}
	/**
	 * 断开连接
	 */
	public void disconnect() {
		if (sftp != null) sftp.disconnect();
		if (sshSession != null) sshSession.disconnect();
	}
	/**
	 * 上传文件
	 * 
	 * @param directory
	 *            上传的目录
	 * @param uploadFile
	 *            要上传的文件
	 * @param sftp
	 */
	public void upload(String directory, String uploadFile) throws Exception {
		sftp.cd(directory);
		File file = new File(uploadFile);
		sftp.put(new FileInputStream(file), file.getName());
	}
	
	public void upload(String directory, File file) throws Exception {
		sftp.cd(directory);
		sftp.put(new FileInputStream(file), file.getName());
		System.out.println("upload file "+file.getAbsolutePath() + " to host " + sshSession.getHost());
	}
	
	public void uploadDir(File src, String dst) throws Exception {
		if (!exist(dst)) {
			sftp.mkdir(dst);
		}
		if (src.isFile()) {
			upload(dst, src);
		} else {
			for (File file : src.listFiles()) {
				if (file.isDirectory()) {
					uploadDir(file, dst + "/" + file.getName());
				}
				upload(dst, file);
			}
		}
	}
	/**
	 * 目录是否查找
	 * @param path
	 * @return
	 * @throws SftpException
	 */
	public boolean exist(String path) throws SftpException {
		String pwd = sftp.pwd();
		try {
			sftp.cd(path);
		} catch (SftpException e) {
			if (e.id == ChannelSftp.SSH_FX_NO_SUCH_FILE) {
				return false;
			} else {
				throw e;
			}
		} finally {
			sftp.cd(pwd);
		}
		
		return true;
	}
	/**
	 * 下载文件
	 * @param directory
	 * @param downloadFile
	 * @param saveFile
	 * @throws Exception
	 */
	public void download(String directory, String downloadFile, String saveFile) throws Exception {
		sftp.cd(directory);
		File file = new File(saveFile);
		sftp.get(downloadFile, new FileOutputStream(file));
	}
	
	/**
	 * 下载文件
	 * @param directory
	 * @param downloadFile
	 * @param saveFile
	 * @throws Exception
	 */
	public void download(String directory, String downloadFile, File saveFile) throws Exception {
		sftp.cd(directory);
		sftp.get(downloadFile, new FileOutputStream(saveFile));
		System.out.println("download file "+directory + "/" +downloadFile + " from host " + sshSession.getHost());
	}
	
	/**
	 * 下载文件
	 * @param src
	 * @param dst
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public void downloadDir(String src, File dst) throws Exception {
		try {
			sftp.cd(src);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		dst.mkdirs();
		
		Vector<LsEntry> files = sftp.ls(src);
		for (LsEntry lsEntry : files) {
			if (lsEntry.getFilename().equals(".") || lsEntry.getFilename().equals("..")) {
				continue;
			}
			if (lsEntry.getLongname().startsWith("d")) {
				downloadDir(src + "/" + lsEntry.getFilename(), new File(dst, lsEntry.getFilename()));
			} else {
				download(src, lsEntry.getFilename(), new File(dst, lsEntry.getFilename()));
			}
			
		}
	}

	/**
	 *  删除文件
	 * @param directory
	 * @param deleteFile
	 * @throws SftpException
	 */
	public void delete(String directory, String deleteFile) throws SftpException {
		sftp.cd(directory);
		sftp.rm(deleteFile);
	}

	/**
	 * 列出目录下的文件
	 * @param directory
	 * @return
	 * @throws SftpException
	 */
	public Vector listFiles(String directory) throws SftpException {
		return sftp.ls(directory);
	}

	public static void main(String[] args) throws Exception {
		Sftps sf = new Sftps();
		String host = "192.168.56.101";
		int port = 22;
		String username = "root";
		String password = "123";
		String privateKey = "C:/Users/Administrator/Desktop/seRT_SSH_key/front/Identity";
		String passphrase = "h$VgBrx3nhwH#2!h6zs0uGhzcCX8dTPa";
		String src = "/usr/local/apache-tomcat-7.0.63/webapps/pzedu";
		
		sf.connect(host, port, username, privateKey, passphrase);
		sf.portForwardingL(1194, "10.169.97.248", 1194);
		
//		ChannelSftp sftp = sf.connect(host, port, username, password);
//		sf.upload(directory, uploadFile, sftp);
//		sf.download(directory, downloadFile, saveFile, sftp);
//		sf.delete(directory, deleteFile, sftp);
		
		
//		try {
			Vector files = sf.listFiles("/root");
//			sf.downloadDir(src, new File("C:/staticsfile"));
			sf.uploadDir(new File("C:/staticsfile"), "/root/temp");
//			System.out.println("finished");
//			sftp.disconnect();
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		sf.disconnect();
	}
	
	public Session getSshSession() {
		return sshSession;
	}
	public ChannelSftp getSftp() {
		return sftp;
	}
}
采用的是stfp协议连接。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值