SFTP工具类

1.SFTP搭建方法:

地址:

http://www.jb51.net/article/101405.htm

https://blog.csdn.net/helloloser/article/details/79399575

 

2.SFTP工具类:

import com.jcraft.jsch.*;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.util.Properties;
import java.util.Vector;
/**
 * sftp工具类 实现文件上传、下载、删除操作
 * @author  XIHONGLEI
 * @date 2018-03-26
 */
public class SftpUtil {
    private transient Logger log = LoggerFactory.getLogger(this.getClass());

    private ChannelSftp sftp;

    private Session session;
    /** SFTP 登录用户名*/
    private String username;
    /** SFTP 登录密码*/
    private String password;
    /** 私钥 */
    private String privateKey;
    /** SFTP 服务器地址IP地址*/
    private String host;
    /** SFTP 端口*/
    private int port;


    /**
     * 构造基于密码认证的sftp对象   
     */
    public SftpUtil(String username, String password, String host, int port) {
        this.username = username;
        this.password = password;
        this.host = host;
        this.port = port;
    }

    /**
     * 构造基于秘钥认证的sftp对象  
     */
    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服务器  
     */
    public void login(){
        try {
            JSch jsch = new JSch();
            if (privateKey != null) {
                // 设置私钥
                jsch.addIdentity(privateKey);
            }
            session = jsch.getSession(username, host, port);
            if (password != null) {
                session.setPassword(password);
            }
            Properties config = new Properties();
            config.put("StrictHostKeyChecking", "no");

            session.setConfig(config);
            session.connect();

            Channel channel = session.openChannel("sftp");
            channel.connect();

            sftp = (ChannelSftp) channel;
        } catch (JSchException e) {
            e.printStackTrace();
        }
    }

    /**
     * 关闭连接 server   
     */
    public void logout(){
        if (sftp != null) {
            if (sftp.isConnected()) {
                sftp.disconnect();
            }
        }
        if (session != null) {
            if (session.isConnected()) {
                session.disconnect();
            }
        }
    }

    /**
     * 将输入流的数据上传到sftp作为文件。文件完整路径=basePath+directory 
     * @param basePath  服务器的基础路径  
     * @param directory  上传到该目录   
     * @param sftpFileName  sftp端文件名   
     * @param input   输入流
     */
    public void upload(String basePath,String directory, String sftpFileName, InputStream input) throws SftpException{
        try {
            sftp.cd(basePath);
            sftp.cd(directory);
        } catch (SftpException e) {
            //目录不存在,则创建文件夹  
            String [] dirs=directory.split("/");
            String tempPath=basePath;
            for(String dir:dirs){
                if(null == dir || "".equals(dir)) {
                    continue;
                }
                tempPath+="/"+dir;
                try{
                    sftp.cd(tempPath);
                }catch(SftpException ex){
                    sftp.mkdir(tempPath);
                    sftp.cd(tempPath);
                }
            }
        }
        //上传文件
        sftp.put(input, sftpFileName);
    }

    /**
     * 下载文件。 
     * @param directory 下载目录   
     * @param downloadFile 下载的文件  
     * @param saveFile 存在本地的路径  
     */
    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));
    }

    /**
     * 判断远程SFTP服务器上是否存在某个文件
     * @param directory 目录
     * @param fileName 文件名
     * @return 是否存在
     */
    public boolean isExists(String directory, String fileName){
        boolean isHave = false;
        try {
            sftp.cd(directory);
            SftpATTRS attrs = sftp.stat(fileName);
            if(attrs != null){
                isHave = true;
            }
        } catch (Exception e) {}
        return  isHave;
    }

    /**
     * 下载文件  
     * @param directory 下载目录  
     * @param downloadFile 下载的文件名  
     * @return 字节数组
     */
    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);
        return fileData;
    }

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

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

    /**
     * 测试Main方法
     * @param args
     * @throws SftpException
     * @throws IOException
     */
    public static void main(String[] args) throws SftpException, IOException {
        SftpUtil sftp = new SftpUtil("zhnx","Zhnx$p=!@#z@n$h&x", "139.224.145.186", 22022);
        sftp.login();
       /* File file = new File("F:\\img\\timg.jpg");
        InputStream is = new FileInputStream(file);

        sftp.upload("/IN","", "timg.jpg", is);*/
        byte[] bytes = sftp.download("/IN","timg.jpg");
        ByteUtil.saveFile(bytes,"F:\\img2","timg2.jpg");
        sftp.logout();
    }
}
import java.io.*;

/**
 * byte数组工具类实现byte[]与文件之间的相互转换
 * @author XIHONGLEI
 * @Date 2018-03-26
 */
public class ByteUtil {
    /**
     * 获得指定文件的byte数组
     */
    public static byte[] getBytes(String filePath){
        byte[] buffer = null;
        try {
            File file = new File(filePath);
            FileInputStream fis = new FileInputStream(file);
            ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);
            byte[] b = new byte[1000];
            int n;
            while ((n = fis.read(b)) != -1) {
                bos.write(b, 0, n);
            }
            fis.close();
            bos.close();
            buffer = bos.toByteArray();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return buffer;
    }

    /**
     * 根据byte数组,生成文件
     */
    public static void saveFile(byte[] bfile, String filePath,String fileName) {
        BufferedOutputStream bos = null;
        FileOutputStream fos = null;
        File file = null;
        try {
            File dir = new File(filePath);
            //判断文件目录是否存在
            if(!dir.exists()&&dir.isDirectory()){
                dir.mkdirs();
            }
            file = new File(filePath+"\\"+fileName);
            fos = new FileOutputStream(file);
            bos = new BufferedOutputStream(fos);
            bos.write(bfile);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (bos != null) {
                try {
                    bos.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        }
    }
}

 

posted @ 2018-03-28 14:51  Bodi  阅读(5167)  评论(0编辑  收藏  举报