SFTP文件的上传、下载、删除等操作

sftp工具类:

package 

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.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;


/** 
*  sftp工具类
*/
public class SFTPUtil {
    
    private transient Logger logger = 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 boolean connectSftp(){  
        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;  
            return true;
        } catch (JSchException e) { 
            logger.error("sftp链接异常:", e);
            return false;
        }  
    }    
    
    /** 
     * 关闭连接 server  
     */  
    public void close(){  
        if (sftp != null) {  
            if (sftp.isConnected()) {  
                sftp.disconnect();  
            }  
        }  
        if (session != null) {  
            if (session.isConnected()) {  
                session.disconnect();  
            }  
        }  
    }  

    
    /**  
     * 将输入流的数据上传到sftp作为文件
     * 
     * @param remotePath  sftp文件路径
     * @param sftpFileName  sftp端文件名  
     * @param in   输入流  
     */  
    public void upload(String remotePath, String sftpFileName, InputStream input) throws SftpException{  
        try {   
            sftp.cd(remotePath);
        } catch (SftpException e) { 
            //目录不存在,则创建文件夹
            String [] dirs=remotePath.split(File.separator);
            String tempPath=remotePath;
            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 remotePath sftp文件路径
     * @param downloadFile 下载的文件 
     * @param saveFile 存在本地的路径 
     * @throws IOException  
     */    
    public void download(String saveFile, String remotePath, String fileName) throws Exception{  
        if (remotePath != null && !"".equals(remotePath)) {  
            sftp.cd(remotePath);  
        }  
        File file = new File(saveFile+File.separator+fileName);  
        if(!file.getParentFile().exists()){
            file.getParentFile().mkdirs();
        }
        FileOutputStream out = new FileOutputStream(file);
        
        sftp.get(fileName, out); 
        
        if( out != null){
            out.close();
        }
    }  
    
    /**  
     * 下载文件 
     * @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 要列出的目录 
     * @param sftp 
     */  
    public Vector listFiles(String directory) throws SftpException {  
        return sftp.ls(directory);  
    }  
    
      
    //上传文件测试
    public static void main(String[] args) throws SftpException, IOException {  
        SFTPUtil sftp = new SFTPUtil("用户名", "密码", "ip地址", 22);  
//        sftp.login();  
        File file = new File("D:\\图片\\t0124dd095ceb042322.jpg");  
        InputStream is = new FileInputStream(file);  
          
//        sftp.upload("基础路径","文件路径", "test_sftp.jpg", is);  
        sftp.close();  
    }  
}

你可能感兴趣的:(SFTP文件的上传、下载、删除等操作)