Sftp实现文件的上传下载(com.jcraft.jsch依赖解决解决:Could not parse response code.Server Reply: SSH-2.0-OpenSSH_5.3)

依赖如下

 <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.49</version>
 </dependency>
/**
     * 连接sftp服务器
     *
     * @param host     主机
     * @param port     端口
     * @param username 用户名
     * @param password 密码
     * @return
     */
    public ChannelSftp connect(String host, int port, String username,
                               String password) {
        ChannelSftp sftp = null;
        try {
            JSch jsch = new JSch();
            jsch.getSession(username, host, port);
            Session sshSession = jsch.getSession(username, host, port);
            System.out.println("Session created.");
            sshSession.setPassword(password);
            Properties sshConfig = new Properties();
            sshConfig.put("StrictHostKeyChecking", "no");
            sshSession.setConfig(sshConfig);
            sshSession.connect();
            System.out.println("Session connected.");
            System.out.println("Opening Channel.");
            Channel channel = sshSession.openChannel("sftp");
            channel.connect();
            sftp = (ChannelSftp) channel;
            // sshSession.disconnect();
            System.out.println("Connected to " + host + ".");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sftp;
    }

    /**
     * 上传文件
     *
     * @param directory  上传的目录
     * @param uploadFile 要上传的文件
     * @param sftp
     */
    public void upload(String directory, String uploadFile, ChannelSftp sftp) {
        try {
            sftp.cd(directory);
            File file = new File(uploadFile);
            sftp.put(new FileInputStream(file), file.getName());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 下载文件
     *
     * @param directory    下载目录
     * @param downloadFile 下载的文件
     * @param saveFile     存在本地的路径
     * @param sftp
     */
    public void download(String directory, String downloadFile,
                         String saveFile, ChannelSftp sftp) {
        try {
            sftp.cd(directory);
            File file = new File(saveFile);
            sftp.get(downloadFile, new FileOutputStream(file));
            //  System.out.println(file.getPath());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除文件
     *
     * @param directory  要删除文件所在目录
     * @param deleteFile 要删除的文件
     * @param sftp
     */
    public void delete(String directory, String deleteFile, ChannelSftp sftp) {
        try {
            sftp.cd(directory);
            sftp.rm(deleteFile);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 列出目录下的文件
     *
     * @param directory 要列出的目录
     * @param sftp
     * @return
     * @throws SftpException
     */
    public Vector<ChannelSftp.LsEntry> listFiles(String directory, ChannelSftp sftp)
            throws SftpException {
        return sftp.ls(directory);
    }

    /**
     * 下载ftp文件夹
     * @param ftpMessage 
     * @param time
     * */
    public void downloadFipFile(FtpMessage ftpMessage, int time) {
        Jsch4SftpServiceImpl sf = new Jsch4SftpServiceImpl();
        ChannelSftp sftp = null;
        Session sshSession = null;
        try {
            DateUtil dateUtil = new DateUtil();
            ReadConfig readConfig = new ReadConfig();
            String directory = readConfig.getDownloadDirectory() + dateUtil.getFullDate(time) + returnTime(time) + "/";
            System.out.println("源路径:" + ftpMessage.getIp() + directory);
            String saveFile = null;
            dateUtil = new DateUtil();
            //D:/198environment/temp/2020051112
            String saveDirectory = readConfig.getSourcePath() + "/" + dateUtil.getFullDate(time) + returnTime(time);
            dateUtil = new DateUtil();
            String downLoadDirectory = saveDirectory + "/";
            System.out.println("目标路径:" + downLoadDirectory);
            File file = new File(saveDirectory);
            if (!file.exists()) {
                file.mkdirs();
            }
            File file1 = new File(downLoadDirectory);

            String host = ftpMessage.getIp();
            int port = ftpMessage.getPort();
            String username = ftpMessage.getName();
            String password = ftpMessage.getPwd();
            JSch jsch = new JSch();
            jsch.getSession(username, host, port);
            sshSession = jsch.getSession(username, host, port);
            System.out.println("Session created.");
            sshSession.setPassword(password);
            Properties sshConfig = new Properties();
            sshConfig.put("StrictHostKeyChecking", "no");
            sshSession.setConfig(sshConfig);
            sshSession.connect();
            System.out.println("Session connected.");
            System.out.println("Opening Channel.");
            Channel channel = sshSession.openChannel("sftp");
            channel.connect();
            sftp = (ChannelSftp) channel;
            System.out.println("Connected to " + host + ".");


//          sf.upload(directory, uploadFile, sftp);
//          sf.download(directory, downloadFile, saveFile, sftp);
            //      sf.delete(directory, deleteFile, sftp);

//          sftp.cd(directory);
            dateUtil = new DateUtil();
            /**
             * @param directory    下载目录
             * @param downloadFile 下载的文件
             * @param saveFile     存在本地的路径
             * */
            ///public/data/thunder/2020051112
            if (file1.listFiles().length < Integer.parseInt(readConfig.getDownloadDirectoryFilesNum())) {
                Vector<ChannelSftp.LsEntry> v = sf.listFiles(directory, sftp);
                for (ChannelSftp.LsEntry e : v) {
                    if (!e.getFilename().startsWith(".")) {
                        saveFile = downLoadDirectory + e.getFilename();
                        System.out.println(saveFile);
                        sf.download(directory, e.getFilename(), saveFile, sftp);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sftp.exit();
            sshSession.disconnect();
            System.out.println("session finished");
        }
    }

    public String returnTime(int time) {
        if (time == -1) {
            return "12";
        } else {
            return "00";
        }
    }

你可能感兴趣的:(ftp)