Java Sftp上传下载文件

时间:2022-03-16 14:41:18

需要使用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);
    }