`
征途2010
  • 浏览: 248100 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Sftp工具类

阅读更多
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.Vector;

import org.apache.log4j.Logger;

import com.aspire.prm.app.iodd.common.remoteclient.RemoteClient;
import com.aspire.prm.dmplt.basic.domain.FtpConfig;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpATTRS;
import com.jcraft.jsch.SftpException;

/**
 * name:SFTPClient
 * <p>
 * </p>
 * 
 * @author:lipeng
 * @data:2014-9-22 下午04:29:45
 * @version 1.0
 */
public class SftpClient implements RemoteClient {
    
    private static final Logger logger = Logger.getLogger(SftpClient.class);
    
    private ChannelSftp sftp;
    
    private boolean isReady = false;
    
    private FtpConfig config;
    
    /** 当前工作目录,每次关闭连接要回复到null,因为当前类是单例类 */
    private String directory = null;
    
    private Session sshSession;
    
    /**
     * 连接sftp服务器
     * 
     * @param host 主机
     * @param port 端口
     * @param username 用户名
     * @param password 密码
     * @return
     */
    public SftpClient(FtpConfig config) {
        this.config = config;
        // 设置当前工作目录
        directory = config.getRootPath();
    }
    
    private void setReady() throws Exception {
        try {
            if (!isReady) {
                JSch jsch = new JSch();
                sshSession =
                    jsch.getSession(config.getUsername(), config.getServer(), Integer.parseInt(config.getPort()));
                System.out.println("Session created.");
                sshSession.setPassword(config.getPassword());
                Properties sshConfig = new Properties();
                sshConfig.put("StrictHostKeyChecking", "no");
                sshSession.setConfig(sshConfig);
                isReady = true;
            }
            if (sshSession != null && !sshSession.isConnected()) {
                sshSession.connect();
                Channel channel = sshSession.openChannel("sftp");
                channel.connect();
                sftp = (ChannelSftp) channel;
            }
            
        } catch (Exception e) {
            this.close();
            logger.error("sftp连接服务器出错,host:" + config.getServer(), e);
            throw e;
        }
    }
    
    /**
     * 上传文件
     * 
     * @param directory 上传的目录
     * @param uploadFile 要上传的文件
     * @throws Exception 
     */
    public boolean uploadFile(String uploadFile, String remoteName) throws Exception {
        try {
            setReady();
            if (remoteName.contains("/")) {
                String remotePath = remoteName.substring(0,remoteName.lastIndexOf("/"));
                try {
                    sftp.cd(directory);
                    sftp.mkdir(remotePath);
                } catch (Exception e) {
                }
                sftp.cd(directory+"/"+remotePath);
                remoteName=remoteName.substring(remoteName.lastIndexOf("/") + 1,remoteName.length());
            }else{
                sftp.cd(directory);
            }
            File file = new File(uploadFile);
            sftp.put(new FileInputStream(file), remoteName);
            return true;
        } catch (Exception e) {
            logger.error("sftp上传文件出错,directory:" + directory, e);
            throw e;
        }
    }
    
    /**
     * 下载文件
     * 
     * @param directory 下载目录
     * @param downloadFile 下载的文件
     * @param saveFile 存在本地的路径
     * @throws Exception 
     */
    public boolean downloadFile(String downloadFile, String saveFile) throws Exception {
        try {
            setReady();
            sftp.cd(directory);
            File localFile=new File(saveFile);
            if(localFile!=null&&!localFile.exists()){
                if(localFile.getParentFile()!=null&&!localFile.getParentFile().exists()){
                    localFile.getParentFile().mkdirs();
                }
                localFile.createNewFile();
            }
            sftp.get(downloadFile, new FileOutputStream(localFile));
            return true;
        } catch (Exception e) {
            logger.error("sftp下载文件出错,directory:" + directory, e);
            throw e;
        }
    }
    
    /**
     * 删除文件
     * 
     * @param deleteFile 要删除的文件
     * @throws Exception 
     */
    public boolean removeFile(String deleteFile) throws Exception {
        try {
            setReady();
            sftp.cd(directory);
            sftp.rm(deleteFile);
            return true;
        } catch (Exception e) {
            logger.error("sftp删除文件出错,directory:" + directory, e);
            throw e;
        }
    }
    
    /**
     * 
     * 复制文件
     * @param @param src
     * @param @param dst
     * @param @return
     * @param @throws Exception     
     * @return boolean
     */
    public boolean copyFile(String src,String dst) throws Exception {
        ByteArrayInputStream bStreams =null;
        try {
            setReady();
            if (!isFileExist(src)) {
                //文件不存在直接反回.
                return false;
            }
            String parentPath=dst.substring(0,dst.lastIndexOf("/"));
            if (!this.isDirExist(parentPath)) {
                createDir(parentPath);
            }
            byte[] srcFtpFileByte = inputStreamToByte(sftp.get(src));
             bStreams = new ByteArrayInputStream(srcFtpFileByte);
            //二进制流写文件
            sftp.put(bStreams, dst);
            
            return true;
        } catch (Exception e) {
            logger.error("sftp移动文件出错,[src:" + src+",dst:"+dst+"]", e);
            throw e;
        }finally{
            if(bStreams!=null){
                bStreams.close();
            }
        }
    }
    
    /**
     * 判断远程文件是否存在
     * @param srcSftpFilePath
     * @return
     * @throws SftpException
     */
    public boolean isFileExist (String srcSftpFilePath) throws SftpException {
        boolean isExitFlag = false;
        // 文件大于等于0则存在文件
        if (getFileSize(srcSftpFilePath) >= 0) {
            isExitFlag = true;
        }
        return isExitFlag;
    }
    
    /** 
     * 得到远程文件大小
     * @param srcSftpFilePath
     * @return 返回文件大小,如返回-2 文件不存在,-1文件读取异常
     * @throws SftpException
     */
    public long getFileSize (String srcSftpFilePath) throws SftpException {
        long filesize = 0;//文件大于等于0则存在
        try {
            SftpATTRS sftpATTRS = sftp.lstat(srcSftpFilePath);
            filesize = sftpATTRS.getSize();
        } catch (Exception e) {
            filesize = -1;//获取文件大小异常
            if (e.getMessage().toLowerCase().equals("no such file")) {
                filesize = -2;//文件不存在
            }
        }
        return filesize;
    }
    /**
     * inputStream类型转换为byte类型
     * @param iStrm
     * @return
     * @throws IOException
     */
    public byte[] inputStreamToByte (InputStream iStrm) throws IOException {
        ByteArrayOutputStream bytestream = new ByteArrayOutputStream();
        int ch;
        while ((ch = iStrm.read()) != -1) {
            bytestream.write(ch);
        }
        byte imgdata[] = bytestream.toByteArray();
        bytestream.close();
        return imgdata;
    }
    
    /**
     * 创建远程目录
     * @param sftpDirPath
     * @throws SftpException
     */
    public void createDir (String sftpDirPath) throws SftpException {
        sftp.cd("/");
        String pathArry[] = sftpDirPath.split("/");
        for (String path : pathArry) {
            if (path.equals("")) {
                continue;
            }
            if (isDirExist(path)) {
                sftp.cd(path);
            }
            else {
                //建立目录
                sftp.mkdir(path);
                //进入并设置为当前目录
                sftp.cd(path);
            }
        }
        sftp.cd(directory);
    }
    
    /**
     * 判断目录是否存在
     * @param directory
     * @return
     * @throws SftpException
     */
    public boolean isDirExist (String directory) throws SftpException {
        boolean isDirExistFlag = false;
        try {
            SftpATTRS sftpATTRS = sftp.lstat(directory);
            isDirExistFlag = true;
            return sftpATTRS.isDir();
        } catch (Exception e) {
            if (e.getMessage().toLowerCase().equals("no such file")) {
                isDirExistFlag = false;
            }
        }
        return isDirExistFlag;
    }
    /**
     * 列出目录下的文件
     * 
     * @param directory 要列出的目录
     * @return
     * @throws SftpException
     */
    public Vector<?> listFiles() throws Exception {
        setReady();
        return sftp.ls(directory);
    }
    
    public ChannelSftp getSftp() {
        return sftp;
    }
    
    public void setSftp(ChannelSftp sftp) {
        this.sftp = sftp;
    }
    
    public void close() throws IOException {
        if (sftp != null && sftp.isConnected()) {
            sftp.disconnect();
        }
        if (sshSession != null && sshSession.isConnected()) {
            sshSession.disconnect();
        }
        isReady = false;
        logger.info("JSCH session close");
        
    }
}

 

分享到:
评论

相关推荐

    SFTP工具类

    SFTP 方式 文件上传、文件下载 文件列表。。。。。。。。。

    FTP和SFTP工具类(java)

    FTP和SFTP工具类,基于java语言 其中FTP修改默认模式为被动模式 文档还包括了需要引用的maven依赖内容

    java操作sftp的工具类(JSch)

    本文将详细介绍如何使用JSch进行SFTP操作,并提供一个简单的`SftpUtil`工具类示例。 首先,我们需要了解SFTP的基本概念。SFTP是一种在不安全的网络上安全传输文件的协议,它基于SSH(Secure Shell)协议,提供了...

    java实现sftp操作工具类

    版权声明:本工具类为个人兴趣基于chnSftp编写的应用,个人版权在先,后因各个办公环境无相关软件也有相关的个人使用,和办公环境内的推广使用,也欢迎互联网使用,如涉及相关环境认为本应用有不妥之处,请删除本人...

    连接SSH远程服务器-FTP和SFTP工具类(C#源码)

    连接SSH远程服务器,SFTP、FTP工具类。IFTP为接口,接口基本满足日常项目需要,派生MyFTPClient、MySFTPClient,方便应用扩展及整合到项目,提供例子拿来即用。sftp基于sshNet实现、Renci.SshNet是目前最为强大的C#...

    SFTP上传下载文件工具

    在IT行业中,SFTP工具是网络管理员、开发人员以及需要频繁进行文件传输的用户必不可少的工具之一。"SFTP上传下载文件工具"通常指的是支持SFTP协议的软件应用,这些应用使得用户能够方便地在本地计算机和远程服务器...

    java实现ftp和sftp的工具类

    Java 实现 FTP 和 SFTP 的工具类是网络编程中常见的一种需求,主要用于文件的传输。FTP(File Transfer Protocol)和 SFTP(Secure File Transfer Protocol)虽然都与文件传输有关,但它们之间存在显著的区别。 FTP...

    SFTP上传工具类

    java SFTP上传工具类

    支持多线程的SFTP类代码

    适用多线程的SFTP类,支持代理服务器,是spring服务类,无需修改可直接与spring结合使用。 代码经过大量的并发使用验证,稳定可靠。 依赖的jar包如下: &lt;groupId&gt;com.jcraft&lt;/groupId&gt; &lt;artifactId&gt;...

    php5.6 sftp php_ssh2.dll工具类

    它们可能被这个SFTP工具类调用,以实现各种功能,比如`Crypt`可能用于处理SSH的加密过程,`File`和`Net`可能涉及文件上传下载和网络连接等操作。 总的来说,这个工具类通过PHP 5.6的语法和功能,结合SSH协议,实现...

    sftp的工具类和jar包

    本话题主要围绕"SFTP的工具类和jar包",我们将深入探讨如何利用jsch-0.1.49.jar库以及SFTPUtil.java工具类进行SFTP操作。 首先,`jsch-0.1.49.jar`是JSch库的一个版本,这是一个Java实现的SSH2库,它提供了对SFTP的...

    sftp上传工具之类的东东

    对于SFTP工具,它可能会解释如何配置和使用该软件,包括服务器连接设置、身份验证方法等。 SFTP工具的关键知识点包括: - **SFTP协议**:基于SSH(Secure Shell),提供安全的文件传输服务。 - **身份验证**:SFTP...

    SFTP.java工具类

    sftp java工具类

    java SFTP下载工具类 可上传,下载

    需要配合com.jcraft.jsch包使用 下载地址:http://sourceforge.net/projects/jsch/files/jsch.jar/0.1.51/jsch-0.1.51.jar/download

    Ftp和Sftp上传下载工具类

    该工具支持ftp和sftp的上传和下载 1

    ApacheFTP开源工具

    Apache FTP开源工具是一款基于Java语言实现的FTP(File Transfer Protocol)客户端库,它为开发者提供了在Java应用程序中轻松实现FTP文件传输的能力。Apache FTP工具旨在简化FTP通信过程,避免开发者从头开始编写...

    ssh2常用精简JAR

    在使用这些JAR文件时,确保正确配置了相应的XML配置文件(如struts2-config.xml、spring-context.xml、hibernate.cfg.xml),并将它们添加到项目的类路径中。 总的来说,SSH2框架组合提供了完整的MVC开发解决方案,...

    Sftp操作工具类(java)&amp;jar包

    内含jar包和java实现代码 工具类含以下功能 1 得到当前工作目录地址 2 改变目录为配置的远程目录 3 取文件目录列表 4 取文件列表 5 下载文件 6 复制文件 7 删除文件 8 目录是否存在 文件是否存在 9 移动文件

    java操作sftp上传下载

    接下来,我们将创建一个名为`SFTPTool`的工具类,这个类将包含各种SFTP操作的方法。首先,我们需要建立一个连接到SFTP服务器的会话: ```java import com.jcraft.jsch.*; public class SFTPTool { private JSch ...

Global site tag (gtag.js) - Google Analytics