sftp工具类【附代码DEMO】

来源:互联网 发布:知到生态文明答案 编辑:程序博客网 时间:2024/05/02 00:53

sftp协议介绍

sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。sftp 与 ftp 有着几乎一样的语法和功能。SFTP 为 SSH的一部分,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File Transfer Protocol)的安全文件传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。

 

代码demo

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.util.Properties;import java.util.Vector;import org.apache.commons.lang3.StringUtils;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;/** * sftp工具类 *  * @author cuigh * */public class SftpUtils {public static void main(String[] args) {SftpUtils .upload("/usr/temp/", "d:\\temp\\bak.txt", NginSftpUtils.connect());}/** * 默认连接sftp服务器 *  * @return ChannelSftp */public static ChannelSftp connect() {String host = BasePropertiesUtils.getValue("nginf.sftp.ip");int port = Integer.parseInt(BasePropertiesUtils.getValue("nginf.sftp.port"));String username = BasePropertiesUtils.getValue("nginf.sftp.username");String password = BasePropertiesUtils.getValue("nginf.sftp.password");return connect(host, port, username, password);}/** * 连接sftp服务器 *  * @param host *            主机 * @param port *            端口 * @param username *            用户名 * @param password *            密码 * @return */public static ChannelSftp connect(String host, int port, String username,String password) {ChannelSftp sftp = null;try {JSch jsch = new JSch();jsch.getSession(username, host, port);Session sshSession = jsch.getSession(username, host, port);System.out.println("Session created.");sshSession.setPassword(password);Properties sshConfig = new Properties();sshConfig.put("StrictHostKeyChecking", "no");sshSession.setConfig(sshConfig);sshSession.connect();System.out.println("Session connected.");System.out.println("Opening Channel.");Channel channel = sshSession.openChannel("sftp");channel.connect();sftp = (ChannelSftp) channel;System.out.println("Connected to " + host + ".");} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}return sftp;}/** * 上传文件 *  * @param directory *            上传的目录 * @param uploadFile *            要上传的文件 * @param sftp */public static void upload(String directory, String uploadFile,ChannelSftp sftp) {/*sftp.cd(directory);sftp.cd(dest);sftp.mkdir(dest);File file = new File(uploadFile);sftp.put(new FileInputStream(file), file.getName());*/mkDir(directory, sftp);InputStream in = null;try {sftp.cd(directory);File file = new File(uploadFile);in  = new FileInputStream(file);sftp.put(new FileInputStream(file), file.getName());} catch (SftpException | FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally{    try {                    in.close();                } catch (IOException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }}}/** * 下载文件 *  * @param directory *            下载目录 * @param downloadFile *            下载的文件 * @param saveFile *            存在本地的路径 * @param sftp */public static void download(String directory, String downloadFile,String saveFile, ChannelSftp sftp) {try {sftp.cd(directory);File file = new File(saveFile);sftp.get(downloadFile, new FileOutputStream(file));} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}}/** * 删除文件 *  * @param directory *            要删除文件所在目录 * @param deleteFile *            要删除的文件 * @param sftp */public static void delete(String directory, String deleteFile,ChannelSftp sftp) {try {sftp.cd(directory);sftp.rm(deleteFile);} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}}/** * 列出目录下的文件 *  * @param directory *            要列出的目录 * @param sftp * @return * @throws SftpException */public static Vector listFiles(String directory, ChannelSftp sftp)throws SftpException {return sftp.ls(directory);} /**      * 打开指定目录      *      * @param directory      *            directory      * @return 是否打开目录      */     public static boolean openDir(String directory,ChannelSftp sftp)     {         try         {             sftp.cd(directory);             return true;         }         catch (SftpException e)         {             return false;         }     }         /**      * 创建指定文件夹      *      * @param dirName      *            dirName      */     public static void mkDir(String dirName,ChannelSftp sftp)     {         String[] dirs = dirName.split("/");                 try         {             String now = sftp.pwd();             sftp.cd("/");            for (int i = 0; i < dirs.length; i++)             {             if (StringUtils.isNotEmpty(dirs[i])) {             boolean dirExists = openDir(dirs[i],sftp);                      if (!dirExists)                      {                          sftp.mkdir(dirs[i]);                          sftp.cd(dirs[i]);                      } }            }             sftp.cd(now);         }         catch (SftpException e)         {         e.printStackTrace();        }     } }

 

0 0