zoukankan      html  css  js  c++  java
  • 关于Java使用SFTP实现文件上传下载

    直接上代码:(代码可以直接使用)

    package com.lijy.util;  
      
    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;  
    import org.apache.log4j.Logger;  
      
    import java.io.File;  
    import java.io.FileInputStream;  
    import java.io.FileNotFoundException;  
    import java.io.FileOutputStream;  
    import java.io.IOException;  
    import java.io.OutputStream;  
    import java.util.Properties;  
      
    public class FtpUtil {  
        /**log*/  
        protected static Logger log = Logger.getLogger(FtpUtil.class);  
      
        public static final String NO_FILE = "No such file";  
      
        private ChannelSftp sftp = null;  
      
        private Session sshSession = null;  
      
        private String username;  
      
        private String password;  
      
        private String host;  
      
        private int port;  
      
        public FtpUtil(String username, String password, String host, int port) {  
            this.username = username;  
            this.password = password;  
            this.host = host;  
            this.port = port;  
        }  
      
        /** 
         * 连接sftp服务器 
         * @return ChannelSftp sftp类型 
         * @throws GoPayException 
         */  
        public ChannelSftp connect() throws GoPayException {  
            log.info("FtpUtil-->connect--ftp连接开始>>>>>>host=" + host + ">>>port" + port + ">>>username=" + username);  
            JSch jsch = new JSch();  
            try {  
                jsch.getSession(username, host, port);  
                sshSession = jsch.getSession(username, host, port);  
                log.info("ftp---Session created.");  
                sshSession.setPassword(password);  
                Properties properties = new Properties();  
                properties.put("StrictHostKeyChecking", "no");  
                sshSession.setConfig(properties);  
                sshSession.connect();  
                log.info("ftp---Session connected.");  
                Channel channel = sshSession.openChannel("sftp");  
                channel.connect();  
                log.info("Opening Channel.");  
                sftp = (ChannelSftp) channel;  
                log.info("ftp---Connected to " + host);  
            }  
            catch (JSchException e) {  
                throw new GoPayException("FtpUtil-->connect异常" + e.getMessage());  
            }  
            return sftp;  
        }  
      
        /** 
         * 载单个文件 
         * @param directory       :远程下载目录(以路径符号结束) 
         * @param remoteFileName  FTP服务器文件名称 如:xxx.txt ||xxx.txt.zip 
         * @param localFile       本地文件路径 如 D:\xxx.txt 
         * @return 
         * @throws GoPayException 
         */  
        public File downloadFile(String directory, String remoteFileName,String localFile) throws GoPayException {  
            log.info(">>>>>>>>FtpUtil-->downloadFile--ftp下载文件"+remoteFileName+"开始>>>>>>>>>>>>>");  
            connect();  
            File file = null;  
            OutputStream output = null;  
            try {  
                file = new File(localFile);  
                if (file.exists()){  
                    file.delete();  
                }  
                file.createNewFile();  
                sftp.cd(directory);  
                output = new FileOutputStream(file);  
                sftp.get(remoteFileName, output);  
                log.info("===DownloadFile:" + remoteFileName + " success from sftp.");  
            }  
            catch (SftpException e) {  
                if (e.toString().equals(NO_FILE)) {  
                    log.info(">>>>>>>>FtpUtil-->downloadFile--ftp下载文件失败" + directory +remoteFileName+ "不存在>>>>>>>>>>>>>");  
                    throw new GoPayException("FtpUtil-->downloadFile--ftp下载文件失败" + directory +remoteFileName + "不存在");  
                }  
                throw new GoPayException("ftp目录或者文件异常,检查ftp目录和文件" + e.toString());  
            }  
            catch (FileNotFoundException e) {  
                throw new GoPayException("本地目录异常,请检查" + file.getPath() + e.getMessage());  
            }  
            catch (IOException e) {  
                throw new GoPayException("创建本地文件失败" + file.getPath() + e.getMessage());  
            }  
            finally {  
                if (output != null) {  
                    try {  
                        output.close();  
                    }  
                    catch (IOException e) {  
                        throw new GoPayException("Close stream error."+ e.getMessage());  
                    }  
                }  
                disconnect();  
            }  
      
            log.info(">>>>>>>>FtpUtil-->downloadFile--ftp下载文件结束>>>>>>>>>>>>>");  
            return file;  
        }  
      
        /** 
         * 上传单个文件 
         * @param directory      :远程下载目录(以路径符号结束) 
         * @param uploadFilePath 要上传的文件 如:D:\test\xxx.txt 
         * @param fileName       FTP服务器文件名称 如:xxx.txt ||xxx.txt.zip 
         * @throws GoPayException 
         */  
        public void uploadFile(String directory, String uploadFilePath, String fileName)  
                throws GoPayException {  
            log.info(">>>>>>>>FtpUtil-->uploadFile--ftp上传文件开始>>>>>>>>>>>>>");  
            FileInputStream in = null;  
            connect();  
            try {  
                sftp.cd(directory);  
            }  
            catch (SftpException e) {  
                try {  
                    sftp.mkdir(directory);  
                    sftp.cd(directory);  
                }  
                catch (SftpException e1) {  
                    throw new GoPayException("ftp创建文件路径失败,路径为" + directory);  
                }  
      
            }  
            File file = new File(uploadFilePath);  
            try {  
                in = new FileInputStream(file);  
                sftp.put(in, fileName);  
            }  
            catch (FileNotFoundException e) {  
                throw new GoPayException("文件不存在-->" + uploadFilePath);  
            }  
            catch (SftpException e) {  
                throw new GoPayException("sftp异常-->" + e.getMessage());  
            }  
            finally {  
                if (in != null){  
                    try {  
                        in.close();  
                    }  
                    catch (IOException e) {  
                        throw new GoPayException("Close stream error."+ e.getMessage());  
                    }  
                }  
                disconnect();  
            }  
            log.info(">>>>>>>>FtpUtil-->uploadFile--ftp上传文件结束>>>>>>>>>>>>>");  
        }  
      
        private synchronized static File certTempEmptyile() {  
            String dirPath = SystemConfig.getProperty("down_settle_file.temp_path");  
            FileUtil.mkDir(dirPath);  
            String newFileName = System.currentTimeMillis() + ".txt";  
            String filePath = dirPath + File.separator + newFileName;  
            File file = new File(filePath);  
            return file;  
        }  
      
        /** 
         * 关闭连接 
         */  
        public void disconnect() {  
            if (this.sftp != null) {  
                if (this.sftp.isConnected()) {  
                    this.sftp.disconnect();  
                    this.sftp = null;  
                    log.info("sftp is closed already");  
                }  
            }  
            if (this.sshSession != null) {  
                if (this.sshSession.isConnected()) {  
                    this.sshSession.disconnect();  
                    this.sshSession = null;  
                    log.info("sshSession is closed already");  
                }  
            }  
        }  
      
    } 
  • 相关阅读:
    cocoaPods 最新系统上的安装和基本使用图文笔记
    iOS cell左滑出现多个功能按钮(IOS8以后支持)
    JPA error org.hibernate.AnnotationException: No identifier specified for entity
    spring-boot Jpa配置
    Java中各种集合(字符串类)的线程安全性!!!
    kafka浅谈
    Redis 指令
    JVM监控及堆栈内存
    redis与mysql性能对比、redis缓存穿透、缓存雪崩
    分布式锁机制
  • 原文地址:https://www.cnblogs.com/ZJOE80/p/8000799.html
Copyright © 2011-2022 走看看