sftp jsch文件移动备份的思路

1.jsch jar包不支持mv cp等移动复制的功能,转换思路,sftp下载文件到本地服务器,目录可以考虑使用/年/月/日层级。

2.然后sftp下载操作完毕,记录一张文件操作表,记录下载状态。

3.在定时备份的任务中,根据文件操作表的下载状态,循环操作:首先检查本地是否该文件存在,存在则在sftp jsch rm删除该文件。

4.最后将本地的文件批量上传到sftp服务器需要转移备份的新文件夹目录上面实现。目录可以考虑使用/年/月/日层级。

jsch支持一次mkdir一个目录,而不允许一次创建多层级目录。需要遍历:

String[] folders = path.split( "/" );
for ( String folder : folders ) {
    if ( folder.length() > 0 ) {
        try {
            sftp.cd( folder );
        }
        catch ( SftpException e ) {
            sftp.mkdir( folder );
            sftp.cd( folder );
        }
    }
}

批量上传(关键代码)

private static ChannelSftp upload(String path, String dst, SftpProgressMonitor monitor) throws SftpException {
        File file = new File(path);
        if (!file.exists()) {
            return null;
        }
        ChannelSftp chSftp = null;
        try {
            chSftp = ChannelSftpSingleton.getInstance().getChannelSftp();
        } catch (JSchException e) {
            e.printStackTrace();
        }
        if (chSftp == null) {
            return null;
        }
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            if (files == null || files.length <= 0) {
                return null;
            }
            for (File f : files) {
                String fp = f.getAbsolutePath();
                if (f.isDirectory()) {
                    String mkdir = dst + "/" + f.getName();
                    try {
                        chSftp.cd(mkdir);
                    } catch (Exception e) {
                        chSftp.mkdir(mkdir);
                    }
                    upload(fp, mkdir, monitor);
                } else {
                    chSftp.put(fp, dst, monitor, ChannelSftp.OVERWRITE);
                }
            }
        } else {
            String fp = file.getAbsolutePath();
            chSftp.put(fp, dst, monitor, ChannelSftp.OVERWRITE);
        }
        return chSftp;
    }

测试类

String src = "本地文件夹目录";
        String dst = "sftp文件夹目录";
        try {
            uploadFilesToServer(src, dst, new SftpProgressMonitor() {
                @Override
                public void init(int i, String src, String dst, long size) {
                    System.out.println("正在上传 " + src + " 到 " + dst + ",文件大小:" + (double) (size) + "b");
                }

                @Override
                public boolean count(long l) {
                    return true;
                }

                @Override
                public void end() {
                    System.out.println("上传成功");
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }

最后需处理jsch的各种退出,各种关闭操作。

 

posted on 2020-06-24 08:47  oktokeep  阅读(1388)  评论(1编辑  收藏  举报