sftp批量上传及批量下载等最全功能的工具类SFTPUtils

sftp批量上传及批量下载等最全功能的工具类

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.ChannelSftp.LsEntry;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpATTRS;
import com.jcraft.jsch.SftpException;
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.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Vector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SFTPUtils
{
  private static final Logger log = LoggerFactory.getLogger(SFTPUtils.class);
  private String host;
  private String username;
  private String password;
  private int port = 22;
  private ChannelSftp sftp = null;
  private Session sshSession = null;

  public SFTPUtils() {
  }

  public SFTPUtils(String host, String username, String password) {
    this.host = host;
    this.username = username;
    this.password = password;
  }

  public SFTPUtils(String host, int port, String username, String password) {
    this.host = host;
    this.username = username;
    this.password = password;
    this.port = port;
  }

  public boolean connect()
  {
    try
    {
      JSch jsch = new JSch();
      jsch.getSession(this.username, this.host, this.port);
      this.sshSession = jsch.getSession(this.username, this.host, this.port);
      if (log.isInfoEnabled()) {
        log.info("Session created.");
      }
      this.sshSession.setPassword(this.password);
      Properties sshConfig = new Properties();
      sshConfig.put("StrictHostKeyChecking", "no");
      this.sshSession.setConfig(sshConfig);
      this.sshSession.connect();
      if (log.isInfoEnabled()) {
        log.info("Session connected.");
      }
      Channel channel = this.sshSession.openChannel("sftp");
      channel.connect();
      if (log.isInfoEnabled()) {
        log.info("Opening Channel.");
      }
      this.sftp = ((ChannelSftp)channel);
      if (log.isInfoEnabled()) {
        log.info("Connected to " + this.host + ".");
      }
      return true;
    } catch (JSchException e) {
      log.error(new Date() + "连接sftp出现异常如下:");
      e.printStackTrace();
    }return false;
  }

  public void disconnect()
  {
    if ((this.sftp != null) && 
      (this.sftp.isConnected())) {
      this.sftp.disconnect();
      if (log.isInfoEnabled()) {
        log.info("sftp is closed already");
      }
    }

    if ((this.sshSession != null) && 
      (this.sshSession.isConnected())) {
      this.sshSession.disconnect();
      if (log.isInfoEnabled())
        log.info("sshSession is closed already");
    }
  }

  public List<String> batchDownLoadFile(String remotePath, String localPath, String fileFormat, String fileEndFormat, boolean del)
  {
    List filenames = new ArrayList();
    if (connect()) {
      try {
        Vector v = listFiles(remotePath);
        if (v.size() > 0) {
          log.info("本次处理文件个数不为零,开始下载...fileSize=" + v.size());
          Iterator it = v.iterator();
          while (it.hasNext()) {
            ChannelSftp.LsEntry entry = (ChannelSftp.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 {
      }
      return filenames;
    }
    return filenames;
  }

  public boolean downloadFile(String remotePath, String remoteFileName, String localPath, String localFileName)
  {
    FileOutputStream fieloutput = null;
    try
    {
      File file = new File(localPath + localFileName);

      fieloutput = new FileOutputStream(file);
      this.sftp.get(remotePath + remoteFileName, fieloutput);
      if (log.isInfoEnabled()) {
        log.info("===DownloadFile:" + remoteFileName + " success from sftp.");
      }
      int i = 1;
      return i;
    } catch (FileNotFoundException e) {
      e.printStackTrace();

      if (null != fieloutput)
        try {
          fieloutput.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
    }
    catch (SftpException e)
    {
      e.printStackTrace();

      if (null != fieloutput)
        try {
          fieloutput.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
    }
    finally
    {
      if (null != fieloutput) {
        try {
          fieloutput.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
    return false;
  }

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

      this.sftp.put(in, remoteFileName);
      int i = 1;
      return i;
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (SftpException e) {
      e.printStackTrace();
    } finally {
      if (in != null) {
        try {
          in.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
    return false;
  }

  public boolean bacthUploadFile(String remotePath, String localPath, String backupPath, boolean del)
  {
    if (connect()) {
      File file = new File(localPath);
      File[] files = file.listFiles();
      for (int i = 0; i < files.length; i++) {
        File f = files[i];
        if ((f.isFile()) && (f.getName().indexOf("bak") == -1)) {
          String fileName = f.getName();
          uploadFile(remotePath, fileName, localPath, fileName);

          FileUtil.copyBackFile(f, fileName, backupPath);
          if (del) {
            f.delete();
          }
        }
      }

      disconnect();
      return true;
    }
    return true;
  }

  public boolean deleteFile(String filePath)
  {
    File file = new File(filePath);
    if (!file.exists()) {
      return false;
    }
    if (!file.isFile()) {
      return false;
    }
    return file.delete();
  }

  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())) {
          this.sftp.cd(filePath.toString());
        }
        else {
          this.sftp.mkdir(filePath.toString());

          this.sftp.cd(filePath.toString());
        }
      }

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

  public boolean isDirExist(String directory)
  {
    boolean isDirExistFlag = false;
    try {
      SftpATTRS sftpATTRS = this.sftp.lstat(directory);
      isDirExistFlag = true;
      return sftpATTRS.isDir();
    } catch (Exception e) {
      if (e.getMessage().toLowerCase().equals("no such file")) {
        isDirExistFlag = false;
      }
    }
    return isDirExistFlag;
  }

  public void deleteSFTP(String directory, String deleteFile)
  {
    try
    {
      this.sftp.rm(directory + deleteFile);
      if (log.isInfoEnabled())
        log.info("delete file success from sftp.");
    }
    catch (SftpException e) {
      e.printStackTrace();
    }
  }

  public void mkdirs(String path)
  {
    File f = new File(path);

    String fs = f.getParent();

    f = new File(fs);

    if (!f.exists())
      f.mkdirs();
  }

  public Vector<?> listFiles(String directory)
    throws SftpException
  {
    return this.sftp.ls(directory);
  }

  public String getHost() {
    return this.host;
  }

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

  public String getUsername() {
    return this.username;
  }

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

  public String getPassword() {
    return this.password;
  }

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

  public int getPort() {
    return this.port;
  }

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

  public ChannelSftp getSftp() {
    return this.sftp;
  }

  public void setSftp(ChannelSftp sftp) {
    this.sftp = sftp;
  }
}
发布了160 篇原创文章 · 获赞 25 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/as4589sd/article/details/104513385