需要使用jar包  jsch-0.1.50.jar

sftp上传下载实现类

package com.bstek.transit.sftp;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

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;

public class SFtpClient {

    private String ftpHost;
    private int ftpPort;
    private String uploadRemotePath; //上传到的服务器目录
    private String downloadRemotePath;//从服务器哪个目录下载
    private String userName;
    private String password;
    private int timeOut = 30000;

    private Session session = null;
    private ChannelSftp channel = null;

    public SFtpClient() {
        super();
    }

    public SFtpClient(String ftpHost, int ftpPort, String uploadRemotePath, String downloadRemotePath, String userName, String password) {
        super();
        this.ftpHost = ftpHost;
        this.ftpPort = ftpPort<=0? 22:ftpPort ;
        this.uploadRemotePath = uploadRemotePath;
        this.downloadRemotePath = downloadRemotePath;
        this.userName = userName;
        this.password = password;
    }

    /**
     * 利用JSch包通过SFTP链接
     * @throws JSchException
     */
    public void connect() throws JSchException {
        try {
            JSch jsch = new JSch();
            session = jsch.getSession(userName, ftpHost, ftpPort);
            // 如果服务器连接不上,则抛出异常
            if (session == null) {
                throw new JSchException("session is null");
            }
            session.setPassword(password);// 设置密码
            session.setConfig("StrictHostKeyChecking", "no");// 设置第一次登陆的时候提示,可选值:(ask
                                                                // | yes | no)
            //设置登陆超时时间
            session.connect(timeOut);

            channel = (ChannelSftp) session.openChannel("sftp");// 创建sftp通信通道
            channel.connect(1000);

        } catch (JSchException e) {
            e.printStackTrace();
            session.disconnect();
            channel.disconnect();
            throw e;
        }

    }

    /**
     * 上传文件
     * @param localFile 本地上传文件
     * @throws SftpException
     * @throws IOException
     */
    public void uploadFile(File localFile) throws SftpException, IOException {

        String fullremoteFileName = this.uploadRemotePath + localFile.getName();
        this.uploadFile(localFile, fullremoteFileName);
    }

    public void uploadFile(File localFile, String fullremoteFileName) throws  IOException, SftpException {
        OutputStream outstream = null;
        InputStream instream = null;

        try {
            // 判断是否是文件夹
            if (!isPath(fullremoteFileName.substring(0, fullremoteFileName.lastIndexOf("/")))) {
                createPath(fullremoteFileName.substring(0, fullremoteFileName.lastIndexOf("/")));
            }

            outstream = channel.put(fullremoteFileName);
            instream = new FileInputStream(localFile);

            byte b[] = new byte[1024];
            int n;
            while ((n = instream.read(b)) != -1) {
                outstream.write(b, 0, n);
            }
            outstream.flush();

        } catch (IOException e) {
            e.printStackTrace();
            throw e;
        } finally {
            try {
                instream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                outstream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
/**
 * 下载文件
 * @param remeotFileName
 * @param downloadLocalFile 下载到本地的文件
 * @throws SftpException
 * @throws IOException
 */
    public void downloadFile(String remeotFileName, File downloadLocalFile) throws SftpException, IOException {

        String fullremoteDownloadFileName = this.downloadRemotePath + remeotFileName;
        this.downloadFile(downloadLocalFile, fullremoteDownloadFileName);
    }

    public void downloadFile(File downloadLocalFile, String fullremoteDownloadFileName) throws  IOException, SftpException {
        OutputStream outstream = null;
        InputStream instream = null;

        try {

            instream = channel.get(fullremoteDownloadFileName);
            outstream = new FileOutputStream(downloadLocalFile);

            byte b[] = new byte[1024];
            int n;
            while ((n = instream.read(b)) != -1) {
                outstream.write(b, 0, n);
            }
            outstream.flush();

        } catch (IOException e) {
            throw e;
        }  catch (SftpException e) {
            throw e;
        }
        finally {
            try {
                if(instream!=null){
                    instream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(outstream != null){
                    outstream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    public void uploadFile(String localPath,String localFileName) throws SftpException, IOException {
        this.uploadFile(localPath,localFileName, localFileName);

    }

    public void uploadFile(String localPath,String localFileName, String remoteFileName) throws SftpException, IOException {
        String fullLocalFileName = localPath + localFileName;
        String fullremoteFileName =this.uploadRemotePath + remoteFileName;
        uploadFile(new File(fullLocalFileName), fullremoteFileName);
    }

    public void disconnect() {
        session.disconnect();
        channel.disconnect();
    }

    public void createPath(String remotePath) {
        String[] paths = remotePath.split("/");
        String currentPath;
        if (remotePath.startsWith("/")) {
            currentPath = "/";
        } else {
            currentPath = "";
        }

        for (String path : paths) {
            if ("".equals(path)) {
                continue;
            }
            currentPath += path + "/";
            try {
                channel.mkdir(currentPath);
            } catch (SftpException e) {
//                e.printStackTrace();
                // throw e;
            }
        }
    }

    public boolean isPath(String remotePath) {
        // 判断是否是文件夹
        try {
            channel.cd(channel.getHome());
            channel.cd(remotePath);
            channel.cd(channel.getHome());
            return true;
        } catch (SftpException e1) {
            // e1.printStackTrace();
            return false;
        }
    }

    public static void main(String[] args) throws IOException {
        // String ftpHost = "10.181.77.68";
        // int ftpPort = 22;
        // String localPath = "D:\\temp\\";
        // String remotePath = "usr/WebSphere/tep/";
        // String userName = "wasadm";
        // String password = "wasadm";
        //
        // SFtpClient sftp = new SFtpClient(ftpHost, ftpPort, localPath,
        // remotePath, userName, password);
        // try {
        // sftp.connect();
        // } catch (JSchException e) {
        // e.printStackTrace();
        // }
        // try {
        // sftp.uploadFile("helloworld\\pom.xml");
        // } catch (Exception e) {
        // e.printStackTrace();
        // }
        // sftp.disconnect();
    }

}

sftp上传下载封装类

package com.bstek.transit.sftp;

import java.io.File;
import java.io.IOException;
import java.util.List;

import org.apache.log4j.Logger;

import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.SftpException;

public class SFtpTools {

    private final static Logger logger = Logger.getLogger(SFtpTools.class);

    private  String ip ;     //IP地址
    private  Integer port;    //端口
    private  String username;//用户名
    private  String password;//密码
    private  String uploadRemotePath;    //上传到服务器的路径
    private  String downloadRemotePath;    //从服务器指定路径下载

    public SFtpTools() {
        super();
    }
/**
 *
 * @param ip
 * @param port
 * @param username
 * @param password
 * @param uploadRemotePath
 * @param downloadRemotePath
 */
    public SFtpTools(String ip, Integer port, String username,String password, String uploadRemotePath,String downloadRemotePath) {
        super();
        this.ip = ip;
        this.port = port;
        this.username = username;
        this.password = password;
        this.uploadRemotePath = uploadRemotePath;
        this.downloadRemotePath = downloadRemotePath;
    }

    public void uploadFiles(File uploadFile) throws JSchException, IOException, SftpException {

        logger.info("connect to SFTP . ip:" + this.ip + "; port:" + this.port + ";uppath:" + this.uploadRemotePath + ";downpath:" + this.downloadRemotePath+ ";username:" + this.username + ";password:" + this.password);

        SFtpClient sFtpClient = new SFtpClient(ip, port, uploadRemotePath, downloadRemotePath,username, password);
        sFtpClient.connect();

        // 上传文件
        logger.info("sftp sending file....local file path = "+uploadFile.getPath());
        sFtpClient.uploadFile(uploadFile);

        // 单台链接关闭
        sFtpClient.disconnect();

    }

    /**
     * 下载文件到指定的路径
     * @param downloadFile
     * @param remeotFileName 要从服务器获取的文件名称
     * @throws JSchException
     * @throws IOException
     * @throws SftpException
     */
    public void downloadFiles(String remeotFileName, File downloadFile) throws JSchException, IOException, SftpException {

        logger.info("connect to SFTP . ip:" + this.ip + "; port:" + this.port + ";uppath:" + this.uploadRemotePath + ";downpath:" + this.downloadRemotePath+ ";username:" + this.username + ";password:" + this.password);

        SFtpClient sFtpClient = new SFtpClient(ip, port, uploadRemotePath, downloadRemotePath,username, password);
        sFtpClient.connect();

        // 下载文件
        logger.info("sftp receiving file....remote file name = "+remeotFileName);
        sFtpClient.downloadFile(remeotFileName,downloadFile);

        // 单台链接关闭
        sFtpClient.disconnect();

    }

    public static void main(String[] args) throws IOException {
//        SFtpUploadBat sfb = new SFtpUploadBat("10.181.77.68&10.181.68.236", "22&22", "D:\\temp\\", "tepppp/&teppp/",
//                "wasadm&wasadm", "wasadm&wasadm");
//        try {
//            sfb.uploadFiles("helloworld\\");
//        } catch (SftpException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        } catch (JSchException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        }
    }

}

sftp上传下载调用

/**
     * 上传扣费文件到行方扣费系统
     * @param uploadRemotePath 服务器文件路径
     * @throws Exception
     */
    public void uploadFeeFile2Core(String currDate)  throws Exception {

        String fileName = FeeSupport.FEE_FILE_UPLOAD_PREFIX+currDate+FeeSupport.FEE_FILE_SUFFIX;
        //查询是否需要上传文件
        String hql = "from SysFileHandle where fileName = '" + fileName+"' and fileType = '"+FeeSupport.FEE_FILE_TYPE_UPLOAD+"' and handleState != '" + FeeSupport.FEE_FILE_STATE_SUCC + "'";
        SysFileHandle fileHandle = this.fileHandleDao.getFileHandleByUnique(hql);

        if(fileHandle!=null){
            // 上传
            try {
                SFtpTools sfb = new SFtpTools(sftpProperty.getIp(), sftpProperty.getPort(),sftpProperty.getUsername(),sftpProperty.getPassword(),sftpProperty.getUploadRemotePath(),sftpProperty.getDownloadRemotePath());
                sfb.uploadFiles(new File(sftpProperty.getUploadLocalPath(),fileHandle.getFileName()));
           
            } catch (Exception e) {
                fileHandle.setHandleState(FeeSupport.FEE_FILE_STATE_FAIL);
                // 更新记录状态
                this.fileHandleDao.updateFileHandle(fileHandle);
                throw e;
            }

            fileHandle.setHandleState(FeeSupport.FEE_FILE_STATE_SUCC);
            // 更新记录状态
            this.fileHandleDao.updateFileHandle(fileHandle);
        }

    }
    
public void downloadFeeFile4Core(String currDate) throws Exception {

        String fileName = FeeSupport.FEE_FILE_DOWNLOAD_PREFIX+currDate+FeeSupport.FEE_FILE_SUFFIX;
        //查询是否需要下载文件
        String hql = "from SysFileHandle where fileName = '" + fileName+"' and fileType = '"+FeeSupport.FEE_FILE_TYPE_DOWNLOAD + "'";
        SysFileHandle fileHandle = this.fileHandleDao.getFileHandleByUnique(hql);

        if(fileHandle != null && currDate.equals(fileHandle.getCreateDate())){
            return ;
        }

        if(fileHandle == null){
            fileHandle = new SysFileHandle();
            fileHandle.setFileName(fileName);
            fileHandle.setFileType(FeeSupport.FEE_FILE_TYPE_DOWNLOAD );
        }
        this.downloadFeeFile4Core(fileHandle,currDate,fileName);
    }

    private void downloadFeeFile4Core( SysFileHandle fileHandle,String currDate,String fileName) throws Exception {

        //需要下载
        try {
            SFtpTools sfb = new SFtpTools(sftpProperty.getIp(), sftpProperty.getPort(),sftpProperty.getUsername(),sftpProperty.getPassword(),sftpProperty.getUploadRemotePath(),sftpProperty.getDownloadRemotePath());
            sfb.downloadFiles(fileName,new File(sftpProperty.getDownloadLocalPath(),fileName));
       
        } catch (Exception e) {

            // 更新记录状态
            this.fileHandleDao.updateFileHandle(fileHandle);
            throw e;
        }

        fileHandle.setHandleState(FeeSupport.FEE_FILE_STATE_NO);
        fileHandle.setCreateDate(currDate);
        // 更新记录状态
        this.fileHandleDao.updateFileHandle(fileHandle);
    }
    

Java Sftp上传下载文件的更多相关文章

  1. SFTP上传下载文件、文件夹常用操作

    SFTP上传下载文件.文件夹常用操作 1.查看上传下载目录lpwd 2.改变上传和下载的目录(例如D盘):lcd  d:/ 3.查看当前路径pwd 4.下载文件(例如我要将服务器上tomcat的日志文 ...

  2. java实操之使用jcraft进行sftp上传下载文件

    sftp作为临时的文件存储位置,在某些场合还是有其应景的,比如对账文件存放.需要提供一个上传的工具类.实现方法参考下: pom.xml中引入类库: <dependency> <gro ...

  3. JAVA Sftp 上传下载

    SftpUtils package xxx;import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelSftp; import com ...

  4. curl实现SFTP上传下载文件

    摘自:https://blog.csdn.net/swj9099/article/details/85292444 #include <stdio.h> #include <stdl ...

  5. THINKPHP 3.2 PHP SFTP上传下载 代码实现方法

     一.SFTP介绍:使用SSH协议进行FTP传输的协议叫SFTP(安全文件传输)Sftp和Ftp都是文件传输协议.区别:sftp是ssh内含的协议(ssh是加密的telnet协议),  只要sshd服 ...

  6. java:工具(汉语转拼音,压缩包,EXCEL,JFrame窗口和文件选择器,SFTP上传下载,FTP工具类,SSH)

    1.汉语转拼音: import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuP ...

  7. Java SFTP 上传、下载等操作

    Java SFTP 上传.下载等操作 实际开发中用到了 SFTP 用于交换批量数据文件,然后琢磨了下这方面的东西,基于 JSch 写了个工具类记录下,便于日后使用. JSch是 SSH2 的纯Java ...

  8. Xshell5下利用sftp上传下载传输文件

    sftp是Secure File Transfer Protocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.sftp 与 ftp 有着几乎一样的语法和功能.SFTP 为 SSH ...

  9. SFTP远程连接服务器上传下载文件-qt4.8.0-vs2010编译器-项目实例

    本项目仅测试远程连接服务器,支持上传,下载文件,更多功能开发请看API自行开发. 环境:win7系统,Qt4.8.0版本,vs2010编译器 qt4.8.0-vs2010编译器项目实例下载地址:CSD ...

随机推荐

  1. 最短路 - floyd算法

    floyd算法是多源最短路算法 也就是说,floyd可以一次跑出所以点两两之间的最短路 floyd类似动态规划 如下图: 用橙色表示边权,蓝色表示最短路 求最短路的流程是这样的: 先把点1到其他点的最 ...

  2. eclipse导入SVN上的Maven多模块项目

    eclipse导入SVN上的Maven多模块项目 博客分类: Eclipse&MyEclipse SVN Maven   一.SVN上Maven多模块项目结构 使用eclipse导入SVN上的 ...

  3. 【Linux】文件存储结构

    大部分的Linux文件系统(如ext2.ext3)规定,一个文件由目录项.inode和数据块组成: 目录项:包括文件名和inode节点号.  Inode:又称文件索引节点,包含文件的基础信息以及数据块 ...

  4. salesforce零基础学习(七十九)简单排序浅谈 篇一

    我们在程序中经常需要对数据列表进行排序,有时候使用SOQL的order by 不一定能完全符合需求,需要对数据进行排序,排序可以有多种方式,不同的方式针对不同的场景.篇一只是简单的描述一下选择排序,插 ...

  5. jenkins 设置 gitlab web hooks

    背景 接口自动化期望代码push后触发实现持续集成,代码push后,自动化执行jenkins的job. 步骤 准备工作 工具:jenkins,gitlab jenkins需要安装插件:git plug ...

  6. DOM树节点和事件

    一.前言:DOM树节点是JS的基础语句.通过节点,能够取到HTML代码中的任意标签,从而对其进行修改和添加各种视觉效果. 二.DOM树节点    DOM节点分为三大类: 元素节点,属性节点,文本节点  ...

  7. MySQL下载安装、基本配置、问题处理

    一 mysql介绍 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是 ...

  8. 斐波那契数列—Java

    斐波那契数列想必大家都知道吧,如果不知道的话,我就再啰嗦一遍, 斐波那契数列为:1 2 3 5 8 13 ...,也就是除了第一项和第二项为1以外,对于第N项,有f(N)=f(N-1)+f(N-2). ...

  9. Spring Cloud Netflix多语言/非java语言支持之Spring Cloud Sidecar

    Spring Cloud Netflix多语言/非java语言支持之Spring Cloud Sidecar 前言 公司有一个调研要做,调研如何将Python语言提供的服务纳入到Spring Clou ...

  10. docker学习之--日常命令

    .查看镜像 sudo docker images sudo pull docker.io #下载镜像 sudo push docker.io #上传镜像 sudo docker save -o cen ...