SFTP文件上传和下载

来源:互联网 发布:四虎影库下载软件 编辑:程序博客网 时间:2024/09/21 08:54
1.jsch官方API查看地址(附件为需要的jar)
http://www.jcraft.com/jsch/

2.jsch简介
JSch(Java Secure Channel)是一个SSH2的纯Java实现。它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到你自己的应用程序。
  SFTP(Secure File Transfer Protocol)安全文件传送协议。可以为传输文件提供一种安全的加密方法。SFTP 为 SSH的一部份,是一种传输文件到服务器的安全方式,但是传输效率比普通的FTP要低。

3.api常用的方法:
put():      文件上传
get():      文件下载
cd():       进入指定目录
ls():       得到指定目录下的文件列表
rename():   重命名指定文件或目录
rm():       删除指定文件
mkdir():    创建目录
rmdir():    删除目录
put和get都有多个重载方法,自己看源代码

4.对常用方法的使用,封装成一个util类

    import java.io.File;      import java.io.FileInputStream;      import java.io.FileNotFoundException;      import java.io.FileOutputStream;      import java.io.IOException;      import java.util.ArrayList;      import java.util.Iterator;      import java.util.List;      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.Session;      import com.jcraft.jsch.SftpATTRS;      import com.jcraft.jsch.SftpException;      import com.jcraft.jsch.ChannelSftp.LsEntry;      /**      * sftp工具类      *       * @author xxx      * @date 2014-6-17      * @time 下午1:39:44      * @version 1.0      */      public class SFTPUtils      {          private static Logger log = Logger.getLogger(SFTPUtils.class.getName());                private String host;//服务器连接ip          private String username;//用户名          private String password;//密码          private int port = 22;//端口号          private ChannelSftp sftp = null;          private Session sshSession = null;                public SFTPUtils(){}                public SFTPUtils(String host, int port, String username, String password)          {              this.host = host;              this.username = username;              this.password = password;              this.port = port;          }                public SFTPUtils(String host, String username, String password)          {              this.host = host;              this.username = username;              this.password = password;          }                /**          * 通过SFTP连接服务器          */          public void connect()          {              try              {                  JSch jsch = new JSch();                  jsch.getSession(username, host, port);                  sshSession = jsch.getSession(username, host, port);                  if (log.isInfoEnabled())                  {                      log.info("Session created.");                  }                  sshSession.setPassword(password);                  Properties sshConfig = new Properties();                  sshConfig.put("StrictHostKeyChecking", "no");                  sshSession.setConfig(sshConfig);                  sshSession.connect();                  if (log.isInfoEnabled())                  {                      log.info("Session connected.");                  }                  Channel channel = sshSession.openChannel("sftp");                  channel.connect();                  if (log.isInfoEnabled())                  {                      log.info("Opening Channel.");                  }                  sftp = (ChannelSftp) channel;                  if (log.isInfoEnabled())                  {                      log.info("Connected to " + host + ".");                  }              }              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");                      }                  }              }              if (this.sshSession != null)              {                  if (this.sshSession.isConnected())                  {                      this.sshSession.disconnect();                      if (log.isInfoEnabled())                      {                          log.info("sshSession is closed already");                      }                  }              }          }                /**          * 批量下载文件          * @param remotPath:远程下载目录(以路径符号结束,可以为相对路径eg:/assess/sftp/jiesuan_2/2014/)          * @param localPath:本地保存目录(以路径符号结束,D:\Duansha\sftp\)          * @param fileFormat:下载文件格式(以特定字符开头,为空不做检验)          * @param fileEndFormat:下载文件格式(文件格式)          * @param del:下载后是否删除sftp文件          * @return          */          public List<String> batchDownLoadFile(String remotePath, String localPath,                  String fileFormat, String fileEndFormat, boolean del)          {              List<String> filenames = new ArrayList<String>();              try              {                  // connect();                  Vector v = listFiles(remotePath);                  // sftp.cd(remotePath);                  if (v.size() > 0)                  {                      System.out.println("本次处理文件个数不为零,开始下载...fileSize=" + v.size());                      Iterator it = v.iterator();                      while (it.hasNext())                      {                          LsEntry entry = (LsEntry) it.next();                          String filename = entry.getFilename();                          SftpATTRS attrs = entry.getAttrs();                          if (!attrs.isDir())                          {                              boolean flag = false;                              String localFileName = localPath + filename;                              fileFormat = fileFormat == null ? "" : fileFormat                                      .trim();                              fileEndFormat = fileEndFormat == null ? ""                                      : fileEndFormat.trim();                              // 三种情况                              if (fileFormat.length() > 0 && fileEndFormat.length() > 0)                              {                                  if (filename.startsWith(fileFormat) && filename.endsWith(fileEndFormat))                                  {                                      flag = downloadFile(remotePath, filename,localPath, filename);                                      if (flag)                                      {                                          filenames.add(localFileName);                                          if (flag && del)                                          {                                              deleteSFTP(remotePath, filename);                                          }                                      }                                  }                              }                              else if (fileFormat.length() > 0 && "".equals(fileEndFormat))                              {                                  if (filename.startsWith(fileFormat))                                  {                                      flag = downloadFile(remotePath, filename, localPath, filename);                                      if (flag)                                      {                                          filenames.add(localFileName);                                          if (flag && del)                                          {                                              deleteSFTP(remotePath, filename);                                          }                                      }                                  }                              }                              else if (fileEndFormat.length() > 0 && "".equals(fileFormat))                              {                                  if (filename.endsWith(fileEndFormat))                                  {                                      flag = downloadFile(remotePath, filename,localPath, filename);                                      if (flag)                                      {                                          filenames.add(localFileName);                                          if (flag && del)                                          {                                              deleteSFTP(remotePath, filename);                                          }                                      }                                  }                              }                              else                              {                                  flag = downloadFile(remotePath, filename,localPath, filename);                                  if (flag)                                  {                                      filenames.add(localFileName);                                      if (flag && del)                                      {                                          deleteSFTP(remotePath, filename);                                      }                                  }                              }                          }                      }                  }                  if (log.isInfoEnabled())                  {                      log.info("download file is success:remotePath=" + remotePath                              + "and localPath=" + localPath + ",file size is"                              + v.size());                  }              }              catch (SftpException e)              {                  e.printStackTrace();              }              finally              {                  // this.disconnect();              }              return filenames;          }                /**          * 下载单个文件          * @param remotPath:远程下载目录(以路径符号结束)          * @param remoteFileName:下载文件名          * @param localPath:本地保存目录(以路径符号结束)          * @param localFileName:保存文件名          * @return          */          public boolean downloadFile(String remotePath, String remoteFileName,String localPath, String localFileName)          {              FileOutputStream fieloutput = null;              try              {                  // sftp.cd(remotePath);                  File file = new File(localPath + localFileName);                  // mkdirs(localPath + localFileName);                  fieloutput = new FileOutputStream(file);                  sftp.get(remotePath + remoteFileName, fieloutput);                  if (log.isInfoEnabled())                  {                      log.info("===DownloadFile:" + remoteFileName + " success from sftp.");                  }                  return true;              }              catch (FileNotFoundException e)              {                  e.printStackTrace();              }              catch (SftpException e)              {                  e.printStackTrace();              }              finally              {                  if (null != fieloutput)                  {                      try                      {                          fieloutput.close();                      }                      catch (IOException e)                      {                          e.printStackTrace();                      }                  }              }              return false;          }                /**          * 上传单个文件          * @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 localPath:本地上传目录(以路径符号结束)          * @param del:上传后是否删除本地文件          * @return          */          public boolean bacthUploadFile(String remotePath, String localPath,                  boolean del)          {              try              {                  connect();                  File file = new File(localPath);                  File[] files = file.listFiles();                  for (int i = 0; i < files.length; i++)                  {                      if (files[i].isFile()                              && files[i].getName().indexOf("bak") == -1)                      {                          if (this.uploadFile(remotePath, files[i].getName(),                                  localPath, files[i].getName())                                  && del)                          {                              deleteFile(localPath + files[i].getName());                          }                      }                  }                  if (log.isInfoEnabled())                  {                      log.info("upload file is success:remotePath=" + remotePath                              + "and localPath=" + localPath + ",file size is "                              + files.length);                  }                  return true;              }              catch (Exception e)              {                  e.printStackTrace();              }              finally              {                  this.disconnect();              }              return false;                }                /**          * 删除本地文件          * @param filePath          * @return          */          public boolean deleteFile(String filePath)          {              File file = new File(filePath);              if (!file.exists())              {                  return false;              }                    if (!file.isFile())              {                  return false;              }              boolean rs = file.delete();              if (rs && log.isInfoEnabled())              {                  log.info("delete file success from local.");              }              return rs;          }                /**          * 创建目录          * @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 (Exception e)              {                  if (e.getMessage().toLowerCase().equals("no such file"))                  {                      isDirExistFlag = false;                  }              }              return isDirExistFlag;          }                /**          * 删除stfp文件          * @param directory:要删除文件所在目录          * @param deleteFile:要删除的文件          * @param sftp          */          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 path          */          public void mkdirs(String path)          {              File f = new File(path);                    String fs = f.getParent();                    f = new File(fs);                    if (!f.exists())              {                  f.mkdirs();              }          }                /**          * 列出目录下的文件          *           * @param directory:要列出的目录          * @param sftp          * @return          * @throws SftpException          */          public Vector listFiles(String directory) throws SftpException          {              return sftp.ls(directory);          }                public String getHost()          {              return host;          }                public void setHost(String host)          {              this.host = host;          }                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;          }                public int getPort()          {              return port;          }                public void setPort(int port)          {              this.port = port;          }                public ChannelSftp getSftp()          {              return sftp;          }                public void setSftp(ChannelSftp sftp)          {              this.sftp = sftp;          }                    /**测试*/          public static void main(String[] args)          {              SFTPUtils sftp = null;              // 本地存放地址              String localPath = "D:/tomcat5/webapps/ASSESS/DocumentsDir/DocumentTempDir/txtData/";              // Sftp下载路径              String sftpPath = "/home/assess/sftp/jiesuan_2/2014/";              List<String> filePathList = new ArrayList<String>();              try              {                  sftp = new SFTPUtils("10.163.201.115", "tdcp", "tdcp");                  sftp.connect();                  // 下载                  sftp.batchDownLoadFile(sftpPath, localPath, "ASSESS", ".txt", true);              }              catch (Exception e)              {                  e.printStackTrace();              }              finally              {                  sftp.disconnect();              }          }      }  

5.需要的时间辅助类,顺带记下,下次可以直接拿来用

    /**      * 时间处理工具类(简单的)      * @author Aaron      * @date 2014-6-17      * @time 下午1:39:44      * @version 1.0      */      public class DateUtil {           /**          * 默认时间字符串的格式          */          public static final String DEFAULT_FORMAT_STR = "yyyyMMddHHmmss";                    public static final String DATE_FORMAT_STR = "yyyyMMdd";                    /**          * 获取系统时间的昨天          * @return          */          public static String getSysTime(){               Calendar ca = Calendar.getInstance();                  ca.set(Calendar.DATE, ca.get(Calendar.DATE)-1);               Date d = ca.getTime();               SimpleDateFormat sdf =  new SimpleDateFormat("yyyyMMdd");               String a = sdf.format(d);              return a;          }                    /**          * 获取当前时间          * @param date          * @return          */          public static String getCurrentDate(String formatStr)          {              if (null == formatStr)              {                  formatStr=DEFAULT_FORMAT_STR;              }              return date2String(new Date(), formatStr);          }                    /**          * 返回年月日          * @return yyyyMMdd          */          public static String getTodayChar8(String dateFormat){              return DateFormatUtils.format(new Date(), dateFormat);          }                    /**          * 将Date日期转换为String          * @param date          * @param formatStr          * @return          */          public static String date2String(Date date, String formatStr)          {              if (null == date || null == formatStr)              {                  return "";              }              SimpleDateFormat df = new SimpleDateFormat(formatStr);                    return df.format(date);          }      }  


0 0