SFTP(文件上传) Cannot connect to specified sftp server

引用链接: https://www.cnblogs.com/DreamFather/p/11327978.html

MAVEN工程,导入依赖

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

工具类

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 : {}:{} \n 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();   
    }   
}

遇到的问题:

SFTPUtil sftp = new SFTPUtil("用户名", "密码", "域名或者IP", 端口号);

使用域名的时候不需要给域名加协议(如https、sftp等)

文件传输接口默认22,如果不知道端口,可以使用22尝试。

 

详细的代码解释:

http://www.cnblogs.com/longyg/archive/2012/06/25/2556576.html(转载)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Spring Boot实现SFTP文件批量上传的示例代码: ```java import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import java.io.File; import java.util.Vector; @Component public class SftpUtil { @Autowired private SftpConfig sftpConfig; /** * 批量上传文件 * * @param directory 上传的目录 * @param uploadFiles 待上传的文件列表 * @return */ public boolean batchUpload(String directory, Vector<File> uploadFiles) { ChannelSftp sftp = null; Session session = null; try { JSch jsch = new JSch(); session = jsch.getSession(sftpConfig.getUsername(), sftpConfig.getHost(), sftpConfig.getPort()); session.setPassword(sftpConfig.getPassword()); session.setConfig("StrictHostKeyChecking", "no"); session.connect(); sftp = (ChannelSftp) session.openChannel("sftp"); sftp.connect(); if (!StringUtils.isEmpty(directory)) { sftp.cd(directory); } for (File file : uploadFiles) { sftp.put(file.getAbsolutePath(), file.getName()); } return true; } catch (Exception e) { e.printStackTrace(); return false; } finally { if (sftp != null) { sftp.disconnect(); } if (session != null) { session.disconnect(); } } } } ``` 在上述代码中,我们使用了JSch库来连接SFTP服务器,并使用ChannelSftp对象进行文件上传。具体实现中,我们通过传入上传目录和待上传文件列表来实现批量上传。在上传之前,我们需要先连接SFTP服务器,并切换到指定的上传目录。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值