import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import java.util.Vector;

import org.apache.log4j.Logger;

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;

*/
public class SftpUtils {
/** 日志对象 */
private static Logger log = Logger.getLogger(SftpUtils.class);
/** SFTP服务器主机地址(IP地址) */
private String host;
/** SFTP连接端口 */
private int port;
/** SFTP登录用户名 */
private String username;
/** SFTP登录密码 */
private String password;
/** SFTP连接会话 */
private Session session;

/**
* 无参构造方法
*/
public SftpUtils() {
}

/**
* 构造方法
*
* @param host
* SFTP服务器主机地址(IP地址)
* @param port
* SFTP连接端口
* @param username
* SFTP登录用户名
* @param password
* SFTP登录密码
* @throws JSchException
*/
public SftpUtils(String host, int port, String username, String password)
throws JSchException {
this.host = host;
this.port = port;
this.username = username;
this.password = password;
// 获得SFTP服务器连接
this.createSession();
}

public String getHost() {
return host;
}

public void setHost(String host) {
this.host = host;
}

public int getPort() {
return port;
}

public void setPort(int port) {
this.port = port;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

/**
* 获得SFTP服务器连接
*
* @throws JSchException
* JSCH异常
*/
public void createSession() throws JSchException {
// 创建JSch对象
JSch jsch = new JSch();
// 根据登录用户名、SFTP服务器主机地址(IP地址)、SFTP连接端口获取一个Session对象
session = jsch.getSession(username, host, port);
// 设置登录密码
session.setPassword(password);
// 设置不验证 HostKey
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
// 设置超时5分钟
session.setTimeout(5 * 60 * 1000);
try {
// 打开会话连接
session.connect();
} catch (JSchException jse) {
// 如果连接已打开,需要销毁连接
if (session.isConnected()) {
session.disconnect();
}
throw new JSchException(
"Connect to the server failed.Please check HOST["
+ host
+ "],PORT["
+ port
+ "],USERNAME["
+ username
+ "],PASSWORD["
+ password
+ "].And check the network connection is working or if the request was denied by the firewall:"
+ jse.getMessage());
}
}

/**
* 断开(销毁)Sessioin
*/
public void disSession() {
if (session != null) {
session.disconnect();
session = null;
}
}

/**
* 获得SFTP连接
*
* @return
* @throws JSchException
*/
private ChannelSftp getChannelSftp() throws JSchException {
// 打开SFTP连接通道
Channel channel = session.openChannel("sftp");
try {
// 打开渠道连接
channel.connect();
} catch (JSchException jse) {
// 如果连接已打开,需要销毁连接
if (channel.isConnected()) {
channel.disconnect();
}
throw new JSchException(
"Connect to the server failed.Please check HOST["
+ host
+ "],PORT["
+ port
+ "],USERNAME["
+ username
+ "],PASSWORD["
+ password
+ "].And check the network connection is working or if the request was denied by the firewall:"
+ jse.getMessage());
}
ChannelSftp channelSftp = (ChannelSftp) channel;
return channelSftp;
}

/**
* 断开(销毁)SFTP连接
*/
private void disChannelSftp(ChannelSftp channelSftp) {
if (channelSftp != null) {
channelSftp.disconnect();
channelSftp.exit();
channelSftp = null;
}
}

/**
* 上传文件
*
* @param directory
* 待上传的目录(如:/finance)
* @param uploadFile
* 待上传的文件
* @param uploadFileName
* 上传文件的新文件名(FTP服务器上存储的文件名,如:EACQ_YNLF_20130615.xls)
* @throws FileNotFoundException
* 文件未不到异常
* @throws SftpException
* SFTP异常
* @throws
*/
public void upload(String directory, File uploadFile, String uploadFileName)
throws JSchException, FileNotFoundException, SftpException {
// 获得SFTP服务器连接
ChannelSftp channelSftp = null;
BufferedInputStream binput = null;
try {
channelSftp = getChannelSftp();
// 进入目录
channelSftp.cd(directory);
// 创建往本地文件中输入的流
binput = new BufferedInputStream(new FileInputStream(uploadFile));
// 上传
channelSftp.put(binput, uploadFileName);
} finally {
if (binput != null) {
try {
binput.close();
} catch (IOException ioe) {
}
}
// 断开(销毁)SFTP连接
disChannelSftp(channelSftp);
}
}

/**
* 下载文件
*
* @param directory
* 待下载目录(如:/finance)
* @param downloadFileName
* 待下载的文件名(EACQ_YNLF_20130615.xls)
* @param saveFile
* 下载后存入本地的文件
* @throws FileNotFoundException
* 文件未不到异常
* @throws SftpException
* SFTP异常
*/
public void download(String directory, String downloadFileName,
File saveFile) throws JSchException, FileNotFoundException,
SftpException {
ChannelSftp channelSftp = null;
BufferedOutputStream boutput = null;
try {
// 获得SFTP服务器连接
channelSftp = getChannelSftp();
// 进入目录
channelSftp.cd(directory);
// 创建往SFTP上输出的流
boutput = new BufferedOutputStream(new FileOutputStream(saveFile));
// 下载
channelSftp.get(downloadFileName, boutput);
} finally {
if (boutput != null) {
try {
boutput.close();
} catch (IOException ioe) {
}
}
// 断开(销毁)SFTP连接
disChannelSftp(channelSftp);
}
}

/**
* 删除文件. 仅支持删除文件,不支持删除目录
*
* @param directory
* 待删除文件所在目录
* @param deleteFile
* 待删除的文件(文件名全称,如:EACQ_YNLF_20130615-up.xls)
* @throws SftpException
* SFTP异常
* @throws JSchException
*/
public void delete(String directory, String deleteFile)
throws JSchException, SftpException {
ChannelSftp channelSftp = null;
try {
// 获得SFTP服务器连接
channelSftp = getChannelSftp();
// 进入目录
channelSftp.cd(directory);
// 删除文件
channelSftp.rm(deleteFile);
} finally {
// 断开(销毁)SFTP连接
disChannelSftp(channelSftp);
}
}

/**
* 列出目录下的文件
*
* @param directory
* 待列出的目录
* @return 目录中的所有文件名列表(包括后缀名,如:EACQ_YNLF_20130615.xls)
* @throws SftpException
* SFTP异常
*/
public Vector<String> listFiles(String directory) throws JSchException,
SftpException {
ChannelSftp channelSftp = null;
Vector<String> fileNameList = new Vector<String>();
try {
// 获得SFTP服务器连接
channelSftp = getChannelSftp();
Vector<Object> objectList = channelSftp.ls(directory);
for (Object obj : objectList) {
// 获取文件名(包括后缀名)
// -rw-r--r-- 1 hsm users 975872 Jul 9 03:26
// EACQ_YNLF_20130615.xls
String curStr = obj.toString();
curStr = curStr.substring(curStr.lastIndexOf(" ") + 1);
if (".".equals(curStr) || "..".equals(curStr)) {// .表示当前目录,..表示上一级目录
continue;
}
fileNameList.add(curStr);
}
} finally {
// 断开(销毁)SFTP连接
disChannelSftp(channelSftp);
}
return fileNameList;
}

/**
* 用于模糊查询某个远程目录下的文件名称. 只要文件名中包含{valiStr}即可列出
*
* @param directory
* 远程目录
* @param valiStr
* 文件名称
* @return 远程目录下的文件名称列表(包括后缀名,如:EACQ_YNLF_20130615.xls)
* @throws SftpException
* SFTP异常
*/
public Vector<String> listFileNames(String directory, String valiStr)
throws JSchException, SftpException {
ChannelSftp channelSftp = null;
Vector<String> fileNameList = new Vector<String>();
try {
// 获得SFTP服务器连接
channelSftp = getChannelSftp();
Vector<Object> objectList = channelSftp.ls(directory);
for (Object obj : objectList) {
// 获取文件名(包括后缀名)
// -rw-r--r-- 1 hsm users 975872 Jul 9 03:26
// EACQ_YNLF_20130615.xls
String curStr = obj.toString();
curStr = curStr.substring(curStr.lastIndexOf(" ") + 1);
// 检查文件名是否包含{valiStr}
if (curStr.contains(valiStr)) {
// 包含即加如Vector
fileNameList.add(curStr);
}
}
} finally {
// 断开(销毁)SFTP连接
disChannelSftp(channelSftp);
}
return fileNameList;
}

/**
* 检查文件是否存在
*
* @param directory
* 远程目录
* @param valiStr
* 文件名称
* @return 是否存在(true-存在 false-不存在)
* @throws SftpException
* SFTP异常
*/
public boolean isExists(String directory, String valiStr)
throws JSchException, SftpException {
ChannelSftp channelSftp = null;
try {
// 获得SFTP服务器连接
channelSftp = getChannelSftp();
Vector<Object> objectList = channelSftp.ls(directory);
for (Object obj : objectList) {
// 获取文件名(包括后缀名)
// -rw-r--r-- 1 hsm users 975872 Jul 9 03:26
// EACQ_YNLF_20130615.xls
String curStr = obj.toString();
curStr = curStr.substring(curStr.lastIndexOf(" ") + 1);
// 检查文件名是否包含{valiStr}
if (curStr.equals(valiStr)) {
return true;
}
}
} finally {
// 断开(销毁)SFTP连接
disChannelSftp(channelSftp);
}
return false;
}

// /**
// * 仅测试用
// *
// * @param args
// * @throws JSchException
// * @throws SftpException
// * @throws FileNotFoundException
// */
// public static void main(String[] args) {
// String IP = "10.10.110.21";
// int PORT = 22;
// String UNAME = "hsm";
// String PWD = "123321";
// String PATH = "/home/hsm/finance";
// SftpUtils utils = null;
// Vector<String> vector = null;
// try {
// utils = new SftpUtils(IP, PORT, UNAME, PWD);
// // 下载
// // utils.download("finance", "EACQ_YNLF_20130615-4.xls",
// // new File("H:\\workspace\\finance\\EACQ_YNLF_20130615-6.xls"));
// // 上传
// // utils.upload("finance", new
// // File("H:\\workspace\\finance\\EACQ_YNLF_20130615(New).xls"),
// // "EACQ_YNLF_20130615-up.xls");
// // 列出目录下的文件
// // vector = utils.listFiles("finance");
// // 用于查询某个远程目录下的文件名称
// // vector = utils.listFileNames("finance","EACQ_YNLF_20130615");
// // for (String str : vector) {
// // System.out.println(str);
// // }
// // 删除文件
// // utils.delete("finance", "test");
// } catch (Exception e) {
// e.printStackTrace();
// }
// // System.exit(0);
// }
}

FTP下载的更多相关文章

  1. ftp下载目录下所有文件及文件夹内(递归)

    ftp下载目录下所有文件及文件夹内(递归)   /// <summary> /// ftp文件上传.下载操作类 /// </summary> public class FTPH ...

  2. 批处理:Windows主机通过FTP下载远程Linux主机上文件

    问题:在Windows上怎么写个批处理把多个文件FTP依次下载到本地某个目录. 批处理脚本示例: @echo off title Download db files. Don't close it!! ...

  3. (转)FTP操作类,从FTP下载文件

    using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Net ...

  4. java ftp下载文件

    1.使用官方正规的jar commons-net-1.4.1.jar jakarta-oro-2.0.8.jar 注意:使用ftp从windows服务器下载文件和从linux服务器下载文件不一样 2. ...

  5. [windows]快速从ftp下载最新软件包的批处理脚本

    背景 由于敏捷开发,快速迭代,我们项目一天会有三个版本,也就意味着我一天要去获取三次软件包.我负责服务端开发,所以我经常需要去拿最新的客户端.我们的客户端放置在一个公共的ftp上面.每天频繁登陆ftp ...

  6. C#FTP下载文件出现远程服务器返回错误: (500) 语法错误,无法识别命令

    如果下载多个文件的时候,有时候莫名其妙的出现500服务器错误,很有可能是没有设置KeepAlive 属性导致的. 出现应用程序未处理的异常:2015/1/6 11:40:56 异常类型:WebExce ...

  7. FTP下载导致Zip解压失败的原因

    情形:网关通过FTP下载快钱对账文件时通过Apache下commons-net的commons-net-3.5.jar进行封装,对账文件中有中文和英文的文字,大部分情况下能够下载成功,而且也能解压成功 ...

  8. Python(x,y) 的 FTP 下载地址

    因为 Python(x,y) 软件包托管在 Google code 上 https://code.google.com/p/pythonxy/,所以国内比较难下载. 这里推荐一个 FTP 下载地址:f ...

  9. http和ftp下载的区别

    HTTP和FTP是两种网络传输协议的缩写,FTP是File Transportation Protocol(文件传输协议)的缩写,而HTTP则是Hyper Text Transportation Pr ...

  10. python从FTP下载文件

    #!/usr/bin/python # -*- coding: utf-8 -*- """ FTP常用操作 """ from ftplib ...

随机推荐

  1. apache gzip

    1.首先启动模块mod_deflate.so和mod_headers.so 2.httpd.conf #文件缓存时间配置<FilesMatch ".(flv|gif|jpg|jpeg| ...

  2. Java并发编程(八)不变性

    提到不变性我首先想到的就是String这个类了. 之前学习了很多原子性以及可见性的问题:失效数据,丢失更新操作或者某个对象的状态不一致,都与多线程试图访问同一个可变的相关. 如果对象的状态不会发生改变 ...

  3. Win从环境变量开启MySQL之旅

    Win通过环境变量开启MySQL之旅 这篇文章主要介绍了Windows7下如何在命令行使用MySQL的相关资料,需要的朋友可以参考下 我在Win7下安装的MySQL版本是mysql-5.0.22-wi ...

  4. 通过Java发射机制调用可变参数函数

    1.获取可变参数的函数       获取可变参数的函数与获取参数类型为数组类型一样. clazz.getMethod("test", Object[].class);    其中O ...

  5. SecurCRT 远程linux 输入中文及 oracle 查询出文号问题

    一. 首先确认你的linux是否设置了支持中文 cat /etc/sysconfig/i18n 其中: LANG 变量是 language 的简称, 这个变量时决定系统的默认语言, 即系统菜单, 程序 ...

  6. Servlet 客户端 HTTP 请求

    当浏览器请求网页时,它会向 Web 服务器发送特定信息,这些信息不能被直接读取,因为这些信息是作为 HTTP 请求的头的一部分进行传输的.您可以查看 HTTP 协议 了解更多相关信息. 以下是来自于浏 ...

  7. Spring4 MVC表单验证

    在这篇文章中,我们将学习如何使用Spring表单标签, 表单验证使用 JSR303 的验证注解,hibernate-validators,提供了使用MessageSource和访问静态资源(如CSS, ...

  8. IOS 键盘协议之中的一个 &lt;UITextFieldDelegate&gt;

    1. 设置键盘的第一响应者后,便可通过点击TextField唤出键盘 设置键盘第一响应者方法为: [textField becomeFirstResponder];//此时,textField 输入框 ...

  9. SQL2008删除大量数据

    常见问题:工作中数据库难免产生大量的日志,而用户可能关心的只有最近一个月左右的,这些日志占用了服务器磁盘,还可能影响了服务运行效率.甚至在数据库迁移时更因为体积而带来巨大麻烦. 那么,在需要时,删除不 ...

  10. urllib基本使用 urlopen(),Request

    urllib包含的常用模块:import urllib.request # 打开和读取url请求import urllib.error # 异常处理模块import urllib.parse # ur ...