sftp实现远程服务器下载文件

package cn.aofeng;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Properties;

import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;

import cn.aofeng.dto.SftpConnectInfo;
import cn.aofeng.util.ConsoleProgressBar;

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;
import com.jcraft.jsch.SftpProgressMonitor;

/**
 * 使用SFTP从远程主机下载文件。
 
 @author 傲风 <aofengblog@163.com>
 */
public class SftpDownloader {

    private final static Logger logger = Logger.getLogger(SftpDownloader.class);
    
    /**
     *
使用SFTP从远程主机下载文件
     
     @param connectInfo SFTP连接信息
     @param localPath 本地文件路径
     @param remotePath 远程文件路径
     */
    public void download(SftpConnectInfo connectInfo, String localPath, final String remotePath) {
        JSch jsch = new JSch();
        Session session  = null;
        ChannelSftp channel = null;
        OutputStream outs = null;
        try {
            session = jsch.getSession(connectInfo.getUsername(), connectInfo.getHost(), connectInfo.getPort());
            session.setPassword(connectInfo.getPassword());
            Properties props = new Properties();
            props.put("StrictHostKeyChecking""no");
            session.setConfig(props);
            session.connect(5000)// 毫秒
            channel = (ChannelSftpsession.openChannel("sftp");
            channel.connect(5000);
            outs = new BufferedOutputStream(
                    new FileOutputStream(
                            new File(localPath)));
            channel.get(remotePath, outs, new SftpProgressMonitor() {
                
                ConsoleProgressBar progress = null;
                
                private long current = 0;
                
                @Override
                public void init(int op, String src, String dest, long max) {
                    progress = new ConsoleProgressBar(0, max, 50);
                }
                
                @Override
                public void end() {
                    if (logger.isInfoEnabled()) {
                        logger.debugString.format("download file:%s complete", remotePath) );
                    }
                }
                
                @Override
                public boolean count(long count) {
                    current += count;
                    progress.show(current);
                                        
                    return true;
                }
            });
        catch (JSchException e) {
            logger.errorString.format("connect remote host[%s:%d] occurs error", connectInfo.getHost(), connectInfo.getPort()), e);
        catch (SftpException e) {
            logger.errorString.format("get remote file:%s occurs error", remotePath), e);
        catch (FileNotFoundException e) {
            logger.errorString.format("can not find local file:%s", localPath), e);
        finally {
            IOUtils.closeQuietly(outs);
            if (null != channel) {
                channel.disconnect();
            }
            if (null != session) {
                session.disconnect();
            }
        }
    }

}


package cn.aofeng.dto;

/**
 * SFTP连接信息。
 
 @author 傲风 <aofengblog@163.com>
 */
public class SftpConnectInfo {
    
    private String username;
    
    private String password;
    
    private String host;
    
    private int port;

    public SftpConnectInfo() {
        
    }
    
    public SftpConnectInfo(String username, String password, String host, int port) {
        this.username = username;
        this.password = password;
        this.host = host;
        this.port = port;
    }
    
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    @Override
    public String toString() {
        return "SftpConnectInfo [username=" + username + ", password="
                + password + ", host=" + host + ", port=" + port + "]";
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值