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

JSch是Java Secure Channel的缩写。JSch是一个SSH2的纯Java实现。它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到你自己的应用程序。

本文只介绍如何使用JSch实现的SFTP功能。

SFTP是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。SFTP 为 SSH的一部份,是一种传输文件到服务器的安全方式。SFTP是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。(来自百度的解释)

要使用JSch,需要下载它的jar包,请从官网下载它:http://www.jcraft.com/jsch/

package com.ebao.jewel.gs.integration.pub.connection.impl;

import java.io.FileNotFoundException;
import java.io.OutputStream;
import java.net.UnknownHostException;
import java.util.Properties;
import java.util.Vector;

import org.apache.commons.httpclient.auth.AuthenticationException;

import com.ebao.jewel.gs.integration.pub.CommonLog.exception.ExceptionUtil;
import com.ebao.jewel.gs.integration.pub.CommonLog.utils.JewelIntLogUtils;
import com.ebao.jewel.gs.integration.pub.commons.InterfaceUtil;
import com.ebao.jewel.gs.integration.pub.connection.IConnection;
import com.ebao.jewel.gs.integration.pub.constants.InterfaceConstants;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;

public class JewelSftpClient implements IConnection {

  private Session sshSession = null;

  private ChannelSftp channelSftp = null;

  private int connectTimes = 0;

  public boolean connect(String host, int port, String username, String pwd)

  throws Exception {
    if (sshSession == null || !sshSession.isConnected()) {

      JSch jsch = new JSch();

      try {
        sshSession = jsch.getSession(username, host, port);
      } catch (JSchException je) {
        // throw new Connection
        throw je;
      }
    }
    if (!sshSession.isConnected()) {
      InterfaceUtil.batchLog("[TEST] sshSession.connect()");
      sshSession.setPassword(pwd);

      Properties sshConfig = new Properties();
      sshConfig.put("StrictHostKeyChecking", "no");
      sshSession.setConfig(sshConfig);
      try {
        sshSession.connect();
      } catch (JSchException ex) {

        if (ex.getMessage().indexOf("Session.connect") != -1) {
          throw new UnknownHostException(ExceptionUtil.getExceptionMsg(ex));
        } else {
          throw new AuthenticationException(ExceptionUtil.getExceptionMsg(ex));
        }
      }
    }
    InterfaceUtil.batchLog("[TEST] sshSession has connected.");
    try {
      if (channelSftp == null || !channelSftp.isConnected()) {
        InterfaceUtil.batchLog("[TEST] channelSftp.connect()");
        channelSftp = (ChannelSftp) sshSession.openChannel("sftp");
        channelSftp.connect();
      }

      InterfaceUtil.batchLog("[TEST] channelSftp has been established.");
      return true;
    } catch (JSchException je) {
      if (connectTimes++ < InterfaceConstants.MAX_CONNECT_TIMES) {
        String seq = connectTimes == 1 ? "1st" : connectTimes == 2
            ? "2nd"
            : connectTimes == 3 ? "3rd" : connectTimes + "st";
        InterfaceUtil.batchLog("[TEST]" + seq
            + " connection failed. Disconnected "
            + (disconnect() == true ? "succeeded" : "failed"));
        long sleepTime = InterfaceUtil.getConnectSleepTime() * 1000L;
        Thread.sleep(sleepTime);
        InterfaceUtil.batchLog("[TEST]" + sleepTime + " ms passed. Try "
            + (int) (connectTimes + 1) + " connection.");
        if (connectTimes == 4) {
          InterfaceUtil
              .batchLog("[TEST] !!!!!!!!!!!connection goes wrong!!!!!!!!!!!!!!!!");
        }
        return connect(host, port, username, pwd);
      } else {
        InterfaceUtil.batchLog("[TEST] connect excceeded 10 times.");
        throw je;
      }
    }
  }

  public boolean disconnect() throws Exception {
    try {
      if (channelSftp != null && channelSftp.isConnected()) {

        channelSftp.disconnect();
        InterfaceUtil.batchLog("[TEST] channelSftp has cloesd.");
      }
      if (sshSession != null && sshSession.isConnected()) {

        sshSession.disconnect();
        InterfaceUtil.batchLog("[TEST] sshSession has cloesd.");
      }
      return true;
    } catch (Exception e) {
      return false;

    }

  }

  public void upload(String src, String dst) throws Exception {
    channelSftp.put(src, dst);
  }

  public void download(String src, String dst) throws Exception {
    channelSftp.get(src, dst);

  }

  @SuppressWarnings("unchecked")
  public Vector<Object> listFiles(String directory) throws Exception {
    try {
      channelSftp.cd(directory);
    } catch (Exception e) {
      throw new FileNotFoundException("No such file or directory.src:"
          + directory);
    }
    Vector<Object> files = channelSftp.lsnames(directory);
    return files;

  }

  public boolean moveFile(String src, String dst) throws Exception {
    try {
      channelSftp.rename(src, dst);
      return true;
    } catch (Exception e) {
      JewelIntLogUtils.batchLog("[TEST] Move the file from " + src + " to "
          + dst + " fail", e);
      throw e;
    }
  }

  public boolean isConnected() {
    return channelSftp != null && channelSftp.isConnected();
  }

  @Override
  public void download(String src, OutputStream out) throws Exception {
    channelSftp.get(src, out);
  }
}

代码copy 同事的

转载地址是 :http://www.cnblogs.com/longyg/archive/2012/06/25/2556576.html

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

时间: 2024-10-01 22:56:39

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

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

JSch是Java Secure Channel的缩写.JSch是一个SSH2的纯Java实现.它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到你自己的应用程序. 本文只介绍如何使用JSch实现的SFTP功能. SFTP是Secure File Transfer Protocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.SFTP 为 SSH的一部份,是一种传输文件到服务器的安全方式.SFTP是使用加密传输认证信息和传输

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

JSch是Java Secure Channel的缩写.JSch是一个SSH2的纯Java实现.它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到你自己的应用程序. 本文只介绍如何使用JSch实现的SFTP功能. SFTP是Secure File Transfer Protocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.SFTP 为 SSH的一部份,是一种传输文件到服务器的安全方式.SFTP是使用加密传输认证信息和传输

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

http://www.byywee.com/page/M0/S755/755589.html 本文只介绍如何应用JSch实现的SFTP功能. SFTP是Secure File Transfer Protocol的缩写,安然文件传送和谈.可认为传输文件供给一种安然的加密办法.SFTP 为 SSH的一部份,是一种传输文件到办事器的安然体式格式.SFTP是应用加密传输认证信息和传输的数据,所以,应用SFTP是很是安然的.然则,因为这种传输体式格式应用了加密/解密技巧,所以传输效力比通俗的FTP要低得多

Struts2之struts2文件上传详解

一.学习案例:通过在uploadfile.jsp页面填写完表单,提交后跳转到success.jsp页面,然后验证upload包下上传文件是否成功. 二.案例分析:struts2文件上传并不是表面上看的只需简单配置就可以上传文件.实际是分为两步的.1.struts2首先将客户端上传的文件保存到struts.multipart.saveDir键所指定的目录,如果该键所对应的目录不存在,就会保存到javax.servlet.context.tempdir环境变量所指定的目录中.2.Action中所定义

第十六部分_Struts2.1文件上传详解

文件上传要求: 表单设为post enctype="multipart/form-data" 服务器端File对应的名字与jsp中指定的文件name相同(对于真正上传的文件), 而String *FileName对应上传的文件名(*表示jsp中文件name) 添加Jar包(commons-io-1.3.2.jar),否则上传失败,抛出io相关类找不到的信息. 否则文件上传失败 首先,写一个upload.jsp: 引入标签库: <%@ taglib uri="/strut

c#大文件上传详解及实例代码

最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表格数据.上传影音文件等.如果文件体积比较大,或者网络条件不好时,上传的时间会比较长(要传输更多的报文,丢包重传的概率也更大),用户不能刷新页面,只能耐心等待请求完成. 下面从文件上传方式入手,整理大文件上传的思路,并给出了相关实例代码,由于PHP内置了比较方便的文件拆分和拼接方法,因此服务端代码使用

局域网大文件上传详解及实例代码

javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1.通过form表单向后端发送请求 <form id="postForm" action="${pageContext.request.contextPath}/UploadServlet" method="post" enctype="multipart/form-data"> <

python爬虫:Multipart/form-data POST文件上传详解

简单的HTTP POST 大家通过HTTP向服务器发送POST请求提交数据,都是通过form表单提交的,代码如下: <form method="post"action="http://w.sohu.com" > <inputtype="text" name="txt1"> <inputtype="text" name="txt2"> </form

Multipart/form-data POST文件上传详解

简单的HTTP POST 大家通过HTTP向服务器发送POST请求提交数据,都是通过form表单提交的,代码如下: <form method="post"action="http://w.sohu.com" > <inputtype="text" name="txt1"> <inputtype="text" name="txt2"> </form