`

java通过sftp上传文件

    博客分类:
  • java
 
阅读更多

第一步 引入依赖包

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

 

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

分享到:
评论

相关推荐

    JAVA SFTP文件上传、下载及批量下载实例

    在上面的示例代码中,我们创建了一个SFTPUtils类,其中包含了连接SFTP服务器、上传文件、下载文件等方法。这些方法使用JSch库来实现SFTP的功能。 在实际应用中,我们可以根据需要封装成一个util类,提供给其他应用...

    Java sftp上传文件夹demo

    在本示例中,我们将深入探讨如何使用JSch库来实现通过SFTP上传整个文件夹的功能。 首先,我们需要在项目中添加JSch库。如果你使用Maven,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;...

    JavaSFTP上传文件

    在Java编程中,SFTP(Secure File ...综上所述,Java操作SFTP上传和下载文件主要涉及到JSch库的使用,包括连接配置、通道创建、文件操作以及断开连接等步骤。在实际开发中,应结合具体需求,优化代码并确保安全性。

    JSch - Java实现的SFTP(文件上传详解篇)

    JSch - Java实现的SFTP(文件上传详解篇)

    java实现sftp上传下载文件

    例如,`put()`方法用于上传文件。 ```java FileInputStream fis = new FileInputStream("localFilePath"); sftpChannel.put(fis, "remoteFilePath"); fis.close(); ``` 4. **文件下载**:下载文件则可以使用`get()...

    java sftp文件上传

    - 递归上传整个目录:你可以编写一个递归函数,遍历本地目录并逐个上传文件。 - 断点续传:如果支持,可以利用SFTP的`fstat`和`position`命令来实现。 - 传输进度监控:通过监听`ChannelSftp`的`progress`事件,...

    java 导出csv文件并上传sftp

    4. 上传文件:使用SFTPChannel的`put`方法将本地文件上传到服务器的指定路径。 5. 关闭连接:在完成上传后,记得关闭SFTP通道和Session。 以下是使用JSCH上传文件的示例代码: ```java JSch jsch = new JSch(); ...

    java实现导出csv文件并上传sftp

    5. 使用`put()`方法上传文件。 6. 完成上传后,记得断开连接。 以下是一个简单的SFTP上传示例: ```java import com.jcraft.jsch.*; public class SftpUploader { public static void uploadFile(String host, ...

    JAVA实现SFTP上传,下载,删除等方法

    本文将详细讲解如何使用开源库JSch来实现在Java中进行SFTP的上传、下载以及删除文件的方法。 JSch是一个纯Java实现的SSH2库,它提供了对SFTP的支持,允许我们在Java应用中安全地执行文件传输。首先,我们需要添加...

    java通过sftp模式实现FTP的文件上传下载删除功能

    本篇文章将详细探讨如何使用Java通过SFTP模式实现FTP的文件上传、下载和删除功能。 一、SFTP简介 SFTP与传统的FTP不同,FTP在明文传输数据,存在安全隐患,而SFTP则利用SSH提供的加密机制,确保数据在传输过程中的...

    java代码sftp和ftp上传下载文件

    本文将深入探讨如何使用Java实现SFTP(Secure File Transfer Protocol)和FTP(File Transfer Protocol)进行文件的上传与下载,以满足在Linux服务器上的操作需求。 首先,FTP是一种用于在网络之间传输文件的标准...

    java实现sftp客户端上传文件以及文件夹的功能

    3. **文件上传**:在Java中实现SFTP上传文件的核心代码通常包括以下步骤: - 创建`JSch`实例。 - 使用`JSch`实例创建`Session`对象,设置主机名、端口、用户名和登录方式相关参数。 - 调用`Session`的`connect()`...

    java实现sftp文件夹上传

    以上就是使用Java Swing实现SFTP文件夹上传的基本步骤,包括建立SSH连接、使用SFTP通道、上传文件和递归上传文件夹。对于生产环境,建议添加异常处理和错误提示,以及更安全的策略,如使用密钥对而非密码进行身份...

    java操作sftp上传下载

    现在我们有了基本的连接,可以实现上传文件的方法: ```java public void uploadFile(String localPath, String remotePath) throws SftpException { FileInputStream fis = new FileInputStream(localPath); ...

    Java使用SFTP上传文件到服务器的简单使用

    以上就是Java使用JSch库通过SFTP上传文件的基本流程。需要注意的是,实际开发中还需要处理各种异常情况,例如网络问题、权限问题等,确保程序的健壮性。同时,为了提高性能,可以考虑使用多线程进行批量文件上传。...

    java使用sftp实现文件的上传与分片上传

    java使用sftp实现文件的上传与分片上传

    java操作sftp的工具类(JSch)

    这个工具类提供了上传文件的功能,可以根据需要扩展其他功能,如下载文件、删除文件、创建目录等。通过调用`SftpUtil.uploadFile()`方法,可以轻松地实现SFTP文件上传。 总之,JSch库为Java开发者提供了一个强大的...

    使用Java向服务器上传文件压缩包并实现解压缩

    总的来说,Java结合JSch库可以方便地实现与SFTP服务器的交互,包括上传文件压缩包、解压缩、创建目录等操作。这些功能在分布式系统、云存储和自动化运维场景中都十分常见。通过熟练掌握这些技能,开发人员能够构建...

    sftp上传下载 java

    以下是一个简单的Java SFTP上传文件的示例: 1. 引入JSch库: ```java import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; ``` 2. 创建并配置JSch对象,建立SSH...

Global site tag (gtag.js) - Google Analytics