`

java 之sftp实现

    博客分类:
  • java
阅读更多
上周进行了linux环境下sftp的配置和用户权限的创建:http://jiandequn.iteye.com/blog/2414753

今天进行java下对sftp的操作,这里就不多说了,直接上代码
首先依赖包
   <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.54</version>
        </dependency>

SFtpUpload.java 类
package com.jiahejiankang.operation.core.util.sftp;
import com.jcraft.jsch.*;
import org.apache.log4j.Logger;
import java.io.*;
public class SFtpUpload {
    private static Logger log = Logger.getLogger(SFtpUpload.class.getName());
    private ChannelSftp sftp = null;
    private Session sshSession = null;
    public SFtpUpload(Session sshSession) {
        this.sshSession =sshSession;
    }
    /**
     * 通过SFTP连接服务器
     */
    public void connect() {
        try {
            Channel channel = sshSession.openChannel("sftp");
            channel.connect();
            if (log.isInfoEnabled()) {
                log.info("Opening Channel.");
            }
            sftp = (ChannelSftp) channel;
            if (log.isInfoEnabled()) {
                log.info("Connected to channel..");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 关闭连接
     */
    public void disconnect() {
        if (this.sftp != null) {
            if (this.sftp.isConnected()) {
                this.sftp.disconnect();
                if (log.isInfoEnabled()) {
                    log.info("sftp is closed already");
                }
            }
        }
    }

    /**
     * 删除stfp文件
     *
     * @param directory:要删除文件所在目录
     * @param deleteFile:要删除的文件
     */
    public void deleteSFTP(String directory, String deleteFile) {
        try {
            // sftp.cd(directory);
            sftp.rm(directory + deleteFile);
            if (log.isInfoEnabled()) {
                log.info("delete file success from sftp.");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 创建目录
     *
     * @param createpath
     * @return
     */
    public boolean createDir(String createpath) {
        try {
            if (isDirExist(createpath)) {
                this.sftp.cd(createpath);
                return true;
            }
            String pathArry[] = createpath.split("/");
            StringBuffer filePath = new StringBuffer("/");
            for (String path : pathArry) {
                if (path.equals("")) {
                    continue;
                }
                filePath.append(path + "/");
                if (isDirExist(filePath.toString())) {
                    sftp.cd(filePath.toString());
                } else {
                    // 建立目录
                    sftp.mkdir(filePath.toString());
                    // 进入并设置为当前目录
                    sftp.cd(filePath.toString());
                }

            }
            this.sftp.cd(createpath);
            return true;
        } catch (SftpException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 判断目录是否存在
     *
     * @param directory
     * @return
     */
    public boolean isDirExist(String directory) {
        boolean isDirExistFlag = false;
        try {
            SftpATTRS sftpATTRS = sftp.lstat(directory);
            isDirExistFlag = true;
            return sftpATTRS.isDir();
        } catch (SftpException e) {
             if (e.getMessage().toLowerCase().equals("no such file")) {
                    isDirExistFlag = false;
             }
        }
        return isDirExistFlag;
    }

    /**
     * 上传单个文件
     *
     * @param remotePath:远程保存目录
     * @param remoteFileName:保存文件名
     * @param localPath:本地上传目录(以路径符号结束)
     * @param localFileName:上传的文件名
     * @return
     */
    public boolean uploadFile(String remotePath, String remoteFileName, String localPath, String localFileName) {
        FileInputStream in = null;
        try {
            createDir(remotePath);
            File file = new File(localPath + localFileName);
            in = new FileInputStream(file);
            sftp.put(in, remoteFileName);
            return true;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (SftpException e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return false;
    }

    /**
     * @param remotePath 远程路径名
     * @param file       文件格式
     * @return
     */
    public boolean uploadFile(String remotePath, File file) {
        FileInputStream in = null;
        try {
            createDir(remotePath);
            in = new FileInputStream(file);
            sftp.put(in, file.getName());
            return true;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (SftpException e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return false;
    }

    /**
     *
     * @param remotePath 目录
     * @param inputStream   流
     * @param remoteFileName 远程文件名
     * @return
     */
    public boolean uploadFile(String remotePath, InputStream inputStream, String remoteFileName) {
        try {
            createDir(remotePath);
            sftp.put(inputStream, remoteFileName);
            return true;
        } catch (SftpException e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return false;
    }
}


SftpFactory.java类
package com.jiahejiankang.operation.core.util.sftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jiahejiankang.operation.core.util.ProperManager;
import org.apache.log4j.Logger;
import java.io.File;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicInteger;
public class SftpFactory {
    private static Logger log = Logger.getLogger(SftpFactory.class.getName());
    private static final String HOST = "192.168.1.44";
    private static final String USERNAME = "mysftp";
    private static final String PWD = "123";
    private static final Integer PORT = "22";
    private static final String SFTP_PATH = "upload";
    private static AtomicInteger atomicInteger = new AtomicInteger(1);
    private static Session sshSession = null;
    public static SFtpUpload getSFtpUpload() {
        sshSession = getSession(USERNAME,HOST,PORT,PWD);
        SFtpUpload sFtpUpload = new SFtpUpload(sshSession);
        atomicInteger.getAndIncrement();
        return sFtpUpload;
    }
    private static synchronized Session getSession(String username,String host,Integer port,String pwd) {
        if(sshSession != null){
            return sshSession;
        }
        JSch jsch = new JSch();
        try {
            sshSession = jsch.getSession(username, host, port);
            if (log.isInfoEnabled()) {
                log.info("Session created.");
            }
            sshSession.setPassword(pwd);
            Properties sshConfig = new Properties();
            sshConfig.put("StrictHostKeyChecking", "no");
            sshSession.setConfig(sshConfig);
            sshSession.connect();
            if (log.isInfoEnabled()) {
                log.info("Session connected.");
            }
        } catch (JSchException e) {
            e.printStackTrace();
        }
        return sshSession;
    }
    public static String upload(String dir, File file) {
        SFtpUpload sFtpUpload = getSFtpUpload();
            try {
                sFtpUpload.connect();

                if(!sFtpUpload.uploadFile(SFTP_PATH+"/"+dir,file)){
                    throw new Exception("上传失败");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                sFtpUpload.disconnect();
                atomicInteger.getAndDecrement();
                disconnect();
            }
        StringBuffer sb = new StringBuffer("sftp://");
        sb.append(USERNAME).append(":").append(PWD)
                .append("@").append(HOST).append(":").append(PORT)
                .append("/").append(SFTP_PATH).append("/").append(dir).append("/").append(file.getName());
         return sb.toString();
    }
    public static void disconnect(){
        if(atomicInteger.intValue() == 1){
            sshSession.disconnect();
        }
    }
}
分享到:
评论

相关推荐

    java版SFTP实现示例(使用jsch)

    总的来说,Java版的SFTP实现利用JSch库可以方便地进行文件的安全传输。通过理解和应用上述代码,开发者可以构建自己的SFTP客户端,实现与远程服务器的交互。这个过程涉及的主要知识点包括:SSH协议、SFTP协议、JSch...

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

    在Java编程中,实现Secure File Transfer Protocol (SFTP) 功能是常见的需求,尤其是在处理远程文件操作时。本文将详细讲解如何使用开源库JSch来实现在Java中进行SFTP的上传、下载以及删除文件的方法。 JSch是一个...

    java操作sftp的工具类(JSch)

    JSch是一个纯Java实现的SSH2库,允许开发人员连接到支持SFTP的服务器,进行文件的上传、下载以及执行其他相关操作。本文将详细介绍如何使用JSch进行SFTP操作,并提供一个简单的`SftpUtil`工具类示例。 首先,我们...

    JAVA通过SFTP实现远程上传下载demo代码

    本文将详细介绍如何使用Java通过SFTP实现远程文件的上传和下载,并提供一个简单的示例代码。 首先,为了实现SFTP功能,我们需要一个第三方库,如JSch(Java Secure Channel)。JSch是一个纯Java实现的SSH2库,它...

    java实现sftp文件夹上传

    本篇文章将深入探讨如何使用Java Swing实现SFTP文件夹上传的功能,并为后续的多目标地址上传做准备。 首先,我们需要导入必要的库。在Java中,我们可以使用JSch库来实现SFTP功能。JSch是一个纯Java实现的SSH2库,它...

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

    在本篇文章中,我们将详细介绍JAVA SFTP文件上传、下载及批量下载的实例,包括相关的概念、API介绍、代码实现等方面的内容。 首先,我们需要了解什么是SFTP?SFTP(Secure File Transfer Protocol)是一种安全的...

    java实现sftp上传下载文件

    本文将详细探讨如何使用Java实现SFTP的文件上传和下载功能,以及如何利用jcraft库来完成这一任务。 首先,jcraft是一个日本开发者团队创建的开源项目,提供了Java实现的SSH2库,其中包括对SFTP的支持。在本示例中,...

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

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

    java实现sftp操作工具类

    1分让你得到sftp常用操作工具,工具实现如下操作: 1)得到当前工作目录地址 2)改变目录为配置的远程目录 3)取文件目录列表 4)取文件列表 5)下载文件 6)复制文件 7)删除文件 8)目录是否存在,文件是否存在 9)移动文件 ...

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

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

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

    二、Java SFTP实现库 在Java中,我们可以使用第三方库如JSch(Java Secure Channel)来实现SFTP功能。JSch是一个轻量级的SSH2库,能够提供SSH2协议下的连接、SFTP文件传输等功能。 三、JSch库的使用 1. 添加依赖:...

    Java sftp上传文件夹demo

    JSch(Java Secure Channel)是一个开放源码的Java库,它实现了SSH2协议,包括SFTP功能。在本示例中,我们将深入探讨如何使用JSch库来实现通过SFTP上传整个文件夹的功能。 首先,我们需要在项目中添加JSch库。如果...

    jsch.jar及实现代码 SftpUtil.java java使用sftp实现上传下载文件

    在这个场景中,我们将详细讨论如何使用`jsch.jar`库以及提供的`SftpUtil.java`工具类来实现在Java中执行SFTP任务。 首先,`jsch.jar`是Java Secure Channel的缩写,这是一个由JCraft公司开发的开源项目。它提供了对...

    详解Java使用Jsch与sftp服务器实现ssh免密登录

    Jsch(Java Secure Channel)是一个纯Java语言编写的库,它能够实现SSH(Secure Shell)功能。SSH是一种安全协议,它主要用于在不同的系统或服务器间建立安全的连接,并在传输数据的过程中对数据进行加密。在Java中...

    java 开发sftp下载上传

    Java作为一种广泛应用的编程语言,提供了丰富的库和工具来实现SFTP功能。本篇文章将深入探讨如何使用Java进行SFTP的文件上传与下载操作。 首先,为了在Java中实现SFTP,我们需要一个支持SFTP的库,例如JSch(Java ...

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

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

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

    Java实现SFTP(Secure File Transfer Protocol)客户端上传文件和文件夹是一项常见的任务,尤其是在系统集成或者数据迁移场景中。下面将详细介绍如何通过Java实现这一功能,主要涉及的技术点包括SFTP协议、JSch库的...

Global site tag (gtag.js) - Google Analytics