zoukankan      html  css  js  c++  java
  • Java Sftp上传下载文件

    需要使用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);
        }
        
    ----------- 赠人玫瑰,手有余香     如果本文对您有所帮助,动动手指扫一扫哟   么么哒 -----------


    未经作者 https://www.cnblogs.com/xin1006/ 梦相随1006 同意,不得擅自转载本文,否则后果自负
  • 相关阅读:
    SpringBoot2.x入门教程:引入jdbc模块与JdbcTemplate简单使用
    2.5万字长文简单总结SpringMVC请求参数接收
    SpringBoot2.x入门:使用CommandLineRunner钩子接口
    百万级别数据Excel导出优化
    SpringBoot2.x入门:应用打包与启动
    谈谈对分布式事务的一点理解和解决方案
    3W字干货深入分析基于Micrometer和Prometheus实现度量和监控的方案
    SpringBoot2.x入门教程:理解配置文件
    SpringBoot2.x入门:引入web模块
    SpringBoot2.x入门:快速创建一个SpringBoot应用
  • 原文地址:https://www.cnblogs.com/xin1006/p/5153854.html
Copyright © 2011-2022 走看看