• java通过sftp上传文件


    第一步 引入依赖包

    基于maven构建工程,pom.xml加入依赖。

    <dependency>  
          <groupId>com.jcraft</groupId>  
          <artifactId>jsch</artifactId>  
          <version>0.1.53</version>  
    </dependency>  

    第二步 工具类

    package com.guohuai.util;    
        
    import java.io.ByteArrayInputStream;    
    import java.io.File;    
    import java.io.FileInputStream;    
    import java.io.FileNotFoundException;    
    import java.io.FileOutputStream;    
    import java.io.IOException;    
    import java.io.InputStream;    
    import java.io.UnsupportedEncodingException;    
    import java.util.Properties;    
    import java.util.Vector;  
    import org.apache.commons.io.IOUtils;    
    import org.slf4j.Logger;    
    import org.slf4j.LoggerFactory;  
    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;  
      
    /**  
     *   
     * @ClassName: SFTPUtil  
     * @Description: sftp连接工具类  
     * @date 2017年5月22日 下午11:17:21  
     * @version 1.0.0  
     */    
    public class SFTPUtil {    
        private transient Logger log = LoggerFactory.getLogger(this.getClass());    
            
        private ChannelSftp sftp;    
              
        private Session session;    
        /** FTP 登录用户名*/      
        private String username;    
        /** FTP 登录密码*/      
        private String password;    
        /** 私钥 */      
        private String privateKey;    
        /** FTP 服务器地址IP地址*/      
        private String host;    
        /** FTP 端口*/    
        private int port;    
              
        /**   
         * 构造基于密码认证的sftp对象   
         * @param userName   
         * @param password   
         * @param host   
         * @param port   
         */      
        public SFTPUtil(String username, String password, String host, int port) {    
            this.username = username;    
            this.password = password;    
            this.host = host;    
            this.port = port;    
        }    
          
        /**   
         * 构造基于秘钥认证的sftp对象  
         * @param userName  
         * @param host  
         * @param port  
         * @param privateKey  
         */    
        public SFTPUtil(String username, String host, int port, String privateKey) {    
            this.username = username;    
            this.host = host;    
            this.port = port;    
            this.privateKey = privateKey;    
        }    
          
        public SFTPUtil(){}    
          
        /**  
         * 连接sftp服务器 
         * @throws Exception   
         */    
        public void login(){    
            try {    
                JSch jsch = new JSch();    
                if (privateKey != null) {    
                    jsch.addIdentity(privateKey);// 设置私钥    
                    log.info("sftp connect,path of private key file:{}" , privateKey);    
                }    
                log.info("sftp connect by host:{} username:{}",host,username);    
          
                session = jsch.getSession(username, host, port);    
                log.info("Session is build");    
                if (password != null) {    
                    session.setPassword(password);      
                }    
                Properties config = new Properties();    
                config.put("StrictHostKeyChecking", "no");    
                      
                session.setConfig(config);    
                session.connect();    
                log.info("Session is connected");    
                    
                Channel channel = session.openChannel("sftp");    
                channel.connect();    
                log.info("channel is connected");    
          
                sftp = (ChannelSftp) channel;    
                log.info(String.format("sftp server host:[%s] port:[%s] is connect successfull", host, port));    
            } catch (JSchException e) {    
                log.error("Cannot connect to specified sftp server : {}:{} 
     Exception message is: {}", new Object[]{host, port, e.getMessage()});      
            }    
        }      
          
        /**  
         * 关闭连接 server   
         */    
        public void logout(){    
            if (sftp != null) {    
                if (sftp.isConnected()) {    
                    sftp.disconnect();    
                    log.info("sftp is closed already");    
                }    
            }    
            if (session != null) {    
                if (session.isConnected()) {    
                    session.disconnect();    
                    log.info("sshSession is closed already");    
                }    
            }    
        }    
          
        /**   
         * 将输入流的数据上传到sftp作为文件 
         * @param directory 上传到该目录   
         * @param sftpFileName sftp端文件名   
         * @param in 输入流   
         * @throws SftpException    
         * @throws Exception   
         */      
        public void upload(String directory, String sftpFileName, InputStream input) throws SftpException{    
            try {      
                sftp.cd(directory);    
            } catch (SftpException e) {    
                log.warn("directory is not exist");    
                sftp.mkdir(directory);    
                sftp.cd(directory);    
            }    
            sftp.put(input, sftpFileName);    
            log.info("file:{} is upload successful" , sftpFileName);    
        }    
          
        /**   
         * 上传单个文件 
         * @param directory 上传到sftp目录   
         * @param uploadFile 要上传的文件,包括路径   
         * @throws FileNotFoundException  
         * @throws SftpException  
         * @throws Exception  
         */    
        public void upload(String directory, String uploadFile) throws FileNotFoundException, SftpException{    
            File file = new File(uploadFile);    
            upload(directory, file.getName(), new FileInputStream(file));    
        }    
          
        /**  
         * 将byte[]上传到sftp,作为文件。注意:从String生成byte[]是,要指定字符集。 
         * @param directory 上传到sftp目录  
         * @param sftpFileName 文件在sftp端的命名  
         * @param byteArr 要上传的字节数组  
         * @throws SftpException  
         * @throws Exception  
         */    
        public void upload(String directory, String sftpFileName, byte[] byteArr) throws SftpException{    
            upload(directory, sftpFileName, new ByteArrayInputStream(byteArr));    
        }    
          
        /**   
         * 将字符串按照指定的字符编码上传到sftp 
         * @param directory 上传到sftp目录  
         * @param sftpFileName 文件在sftp端的命名  
         * @param dataStr 待上传的数据  
         * @param charsetName sftp上的文件,按该字符编码保存  
         * @throws UnsupportedEncodingException  
         * @throws SftpException  
         * @throws Exception  
         */    
        public void upload(String directory, String sftpFileName, String dataStr, String charsetName) throws UnsupportedEncodingException, SftpException{      
            upload(directory, sftpFileName, new ByteArrayInputStream(dataStr.getBytes(charsetName)));      
        }    
          
        /**  
         * 下载文件   
         * @param directory 下载目录   
         * @param downloadFile 下载的文件  
         * @param saveFile 存在本地的路径  
         * @throws SftpException  
         * @throws FileNotFoundException  
         * @throws Exception  
         */      
        public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException{    
            if (directory != null && !"".equals(directory)) {    
                sftp.cd(directory);    
            }    
            File file = new File(saveFile);    
            sftp.get(downloadFile, new FileOutputStream(file));    
            log.info("file:{} is download successful" , downloadFile);    
        }   
          
        /**   
         * 下载文件  
         * @param directory 下载目录  
         * @param downloadFile 下载的文件名  
         * @return 字节数组  
         * @throws SftpException  
         * @throws IOException  
         * @throws Exception  
         */    
        public byte[] download(String directory, String downloadFile) throws SftpException, IOException{    
            if (directory != null && !"".equals(directory)) {    
                sftp.cd(directory);    
            }    
            InputStream is = sftp.get(downloadFile);  
            byte[] fileData = IOUtils.toByteArray(is);  
            log.info("file:{} is download successful" , downloadFile);    
            return fileData;    
        }    
          
        /**  
         * 删除文件  
         * @param directory 要删除文件所在目录  
         * @param deleteFile 要删除的文件  
         * @throws SftpException  
         * @throws Exception  
         */    
        public void delete(String directory, String deleteFile) throws SftpException{    
            sftp.cd(directory);    
            sftp.rm(deleteFile);    
        }    
          
        /**  
         * 列出目录下的文件 
         * @param directory 要列出的目录  
         * @param sftp  
         * @return  
         * @throws SftpException  
         */    
        public Vector<?> listFiles(String directory) throws SftpException {    
            return sftp.ls(directory);    
        }    
            
        public static void main(String[] args) throws SftpException, IOException {    
            SFTPUtil sftp = new SFTPUtil("lanhuigu", "123456", "192.168.200.12", 22);    
            sftp.login();    
            //byte[] buff = sftp.download("/opt", "start.sh");    
            //System.out.println(Arrays.toString(buff));    
            File file = new File("D:\upload\index.html");    
            InputStream is = new FileInputStream(file);    
                
            sftp.upload("/data/work", "test_sftp_upload.csv", is);    
            sftp.logout();    
        }    
    }
    

      转自:https://www.cnblogs.com/ceshi2016/p/7519762.html

  • 相关阅读:
    Sql Server 2005中的架构(Schema)、用户(User)、角色(Role)和登录(Login)(三)
    安装Eclipse的Tomcat插件
    Datedif函数
    web.xml 中的listener、 filter、servlet 加载顺序及其详解(1)
    Sql Server 2005中的架构(Schema)、用户(User)、角色(Role)和登录(Login)一
    关于IIS6.0 发布Web服务的问题 Pete
    什么是Winsock
    RTTI
    Cstring转char、string、int等数据类型的方法
    C++静态成员函数小结
  • 原文地址:https://www.cnblogs.com/DreamFather/p/11327978.html
Copyright © 2020-2023  润新知