首页 > 开发 > Java > 正文

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

2024-07-13 10:05:31
字体:
来源:转载
供稿:网友

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);  }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VeVb武林网。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表