zoukankan      html  css  js  c++  java
  • JAVA SFTP文件上传、下载及批量下载

     

    https://blog.csdn.net/xyjcfucdi128/article/details/99290515

     

    SFTP文件上传和下载

    博客分类:
    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:Duanshasftp)
         * @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);
        }
    }
  • 相关阅读:
    一种查找中值的方法——Rank_Select
    VS 2008 下安装OpenCV 2.3.0 .【转载】
    【转】OpenCV HOGDescriptor 参数图解 .
    VLFeat——SIFT图像特征提取(VC++实现)【转载】
    KD Tree
    【转】让任务管理器画出正弦曲线
    VLFeatmean sift开源库【配置】【转载】
    《程序员求职成功路》之字符串__strtok函数相关理解【转载】
    堆排序
    opencv imread
  • 原文地址:https://www.cnblogs.com/niudaxianren/p/12532141.html
Copyright © 2011-2022 走看看