项目中经常要做上传功能,除了页面使用上传组件外,后台的文件处理一种是 存放在项目中文件夹,另一种存放部署的服务器中,后一种更灵活对项目更友好。
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包,请从官网下载它:
ChannelSftp类是JSch实现SFTP核心类,它包含了所有SFTP的方法,如:
put(): 文件上传
get(): 文件下载
cd(): 进入指定目录
ls(): 得到指定目录下的文件列表
rename(): 重命名指定文件或目录
rm(): 删除指定文件
mkdir(): 创建目录
rmdir(): 删除目录
以下是stfpUtils工具类的方法
- package com.;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.u;
- import java.u;
- import org.a;
- import org.;
- import org.Factory;
- import com.jcra;
- import com.jcraSftp;
- import com.jcraSftp.LsEntry;
- import com.jcra;
- import com.jcra;
- import com.jcra;
- /**
- * sftp 工具类
- *
- * @author weird
- */
- public final class Sftps {
- private static final Logger log = LoggerFac);
- 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 = j(username, host, port);
- log.debug("Session created.");
- (password);
- Properties sshConfig = new Properties();
- ("StrictHostKeyChecking", "no");
- (sshConfig);
- ();
- log.debug("Session connected.");
- log.debug("Opening Channel.");
- Channel channel = ("sftp");
- c();
- 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 (!S(privateKey)) {
- if (!S(passphrase)) {
- //设置带口令的密钥
- j(privateKey, passphrase);
- } else {
- //设置不带口令的密钥
- j(privateKey);
- }
- }
- sshSession = j(username, host, port);
- log.debug("Session created.");
- Properties sshConfig = new Properties();
- ("StrictHostKeyChecking", "no");
- (sshConfig);
- ();
- log.debug("Session connected.");
- log.debug("Opening Channel.");
- Channel channel = ("sftp");
- c();
- sftp = (ChannelSftp) channel;
- log.debug("Connected to " + host + ".");
- return sftp;
- }
- public void portForwardingL(int lport, String rhost, int rport) throws Exception {
- int assinged_port = (lport, rhost, rport);
- Sy("localhost:"+assinged_port+" -> "+rhost+":"+rport);
- }
- /**
- * 断开连接
- */
- public void disconnect() {
- if (sftp != null) ();
- if (sshSession != null) ();
- }
- /**
- * 上传文件
- *
- * @param directory
- * 上传的目录
- * @param uploadFile
- * 要上传的文件
- * @param sftp
- */
- public void upload(String directory, String uploadFile) throws Exception {
- (directory);
- File file = new File(uploadFile);
- (new FileInputStream(file), ());
- }
- public void upload(String directory, File file) throws Exception {
- (directory);
- (new FileInputStream(file), ());
- Sy("upload file "+() + " to host " + ());
- }
- public void uploadDir(File src, String dst) throws Exception {
- if (!exist(dst)) {
- (dst);
- }
- if ()) {
- upload(dst, src);
- } else {
- for (File file : ()) {
- if ()) {
- uploadDir(file, dst + "/" + ());
- }
- upload(dst, file);
- }
- }
- }
- /**
- * 目录是否查找
- * @param path
- * @return
- * @throws SftpException
- */
- public boolean exist(String path) throws SftpException {
- String pwd = ();
- try {
- (path);
- } catch (SftpException e) {
- if == C) {
- return false;
- } else {
- throw e;
- }
- } finally {
- (pwd);
- }
- return true;
- }
- /**
- * 下载文件
- * @param directory
- * @param downloadFile
- * @param saveFile
- * @throws Exception
- */
- public void download(String directory, String downloadFile, String saveFile) throws Exception {
- (directory);
- File file = new File(saveFile);
- (downloadFile, new FileOutputStream(file));
- }
- /**
- * 下载文件
- * @param directory
- * @param downloadFile
- * @param saveFile
- * @throws Exception
- */
- public void download(String directory, String downloadFile, File saveFile) throws Exception {
- (directory);
- (downloadFile, new FileOutputStream(saveFile));
- Sy("download file "+directory + "/" +downloadFile + " from host " + ());
- }
- /**
- * 下载文件
- * @param src
- * @param dst
- * @throws Exception
- */
- @SuppressWarnings("unchecked")
- public void downloadDir(String src, File dst) throws Exception {
- try {
- (src);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- d();
- Vector<LsEntry> files = (src);
- for (LsEntry lsEntry : files) {
- if ().equals(".") || l().equals("..")) {
- continue;
- }
- if ().startsWith("d")) {
- downloadDir(src + "/" + l(), new File(dst, l()));
- } else {
- download(src, l(), new File(dst, l()));
- }
- }
- }
- /**
- * 删除文件
- * @param directory
- * @param deleteFile
- * @throws SftpException
- */
- public void delete(String directory, String deleteFile) throws SftpException {
- (directory);
- (deleteFile);
- }
- /**
- * 列出目录下的文件
- * @param directory
- * @return
- * @throws SftpException
- */
- public Vector listFiles(String directory) throws SftpException {
- return (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;;
- (host, port, username, privateKey, passphrase);
- (1194, "10.169.97.248", 1194);
- // ChannelSftp sftp = (host, port, username, password);
- // (directory, uploadFile, sftp);
- // (directory, downloadFile, saveFile, sftp);
- // (directory, deleteFile, sftp);
- // try {
- //// Vector files = ("/root");
- // Dir(src, new File("C:/staticsfile"));
- //// Dir(new File("C:/staticsfile"), "/root/temp");
- // Sy("finished");
- // ();
- // } catch (Exception e) {
- // e.printStackTrace();
- // }
- // ();
- }
- public Session getSshSession() {
- return sshSession;
- }
- public ChannelSftp getSftp() {
- return sftp;
- }
- }
采用的是stfp协议连接。