Spring boot 使用FTP协议传输文件

亲测:

FTP方式必须事先开发特定的采集程序进行日志数据采集,每次连接都是完整下载整个日志文本文件,网络传输数据量可能非常大,属于主动采集日志数据方式。

想要通过FTP协议传输文件,需先在FTP服务器配置FTP协议:

Windows搭建FTP/SFTP:

https://jingyan.baidu.com/article/574c5219d466c36c8d9dc138.html

Centos 7搭建FTP:

# yum -y install ftp

Centos 7搭建SFTP:

https://blog.csdn.net/xundh/article/details/80346210

Spring Boot 通过FTP/SFTP协议传输文件:

需求:下载 centos 7服务器下的指定路径下的所有文件(Windows也是一样的)

FTP方式:

    implementation('commons-net:commons-net:3.6')
@Service
public class FTPService {

    private static String host = "192.168.1.129";
    private static String user = "ftpuser";
    private static String password = "ftpuser";
    private static String directory = "/var/ftp/pub";
    private static String saveFile = "E:/saveftp";

    /**
     * 获取FTPCLIENT
     */
    private FTPClient getFtpClient() throws SocketException, IOException {
        FTPClient ftp = new FTPClient();
        // 连接
        ftp.connect(host);// 连接FTP服务器
        ftp.login(user,password);// 登陆FTP服务器
        //验证FTP服务器是否登录成功
        int replyCode = ftp.getReplyCode();
        if(!FTPReply.isPositiveCompletion(replyCode)){
            System.out.println("登录验证失败");
        }
        ftp.setControlEncoding("UTF-8"); // 中文支持
        ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
//		ftp.enterLocalPassiveMode();  // 被动模式
        ftp.enterLocalActiveMode();  // 主动模式
        ftp.changeWorkingDirectory(directory);
        return ftp;
    }

    /**
     * FTP下载文件
     */
    public String download() {
        OutputStream os = null;
        String result = "";
        FTPClient ftpClient = new FTPClient();
        try {
            ftpClient = getFtpClient();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("FTP连接发生异常!", e);
        }
        try {
            //切换FTP目录
            ftpClient.changeWorkingDirectory(directory);
            FTPFile[] ftpFiles = ftpClient.listFiles();
            //遍历目录下所有文件
            for(FTPFile file : ftpFiles){
                File localFile = new File(saveFile + File.separator + file.getName());
                os = new FileOutputStream(localFile);
                ftpClient.retrieveFile(file.getName(), os);
                os.close();
            }
            System.out.println("ftp dowmload over");
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("FTP客户端出错!", e);
        } finally {
            try {
                os.close();
                ftpClient.logout();
            } catch (IOException e) {
                e.printStackTrace();
                throw new RuntimeException("关闭FTP连接发生异常!", e);
            }
        }
        return result;
    }
}

SFTP方式:

    implementation 'com.jcraft:jsch:0.1.51'
    implementation 'com.jcraft:jzlib:1.0.7'
@Service
public class SFTPService {

    private FtpRedis ftpRedis;

    private static ChannelSftp sftp = null;

    //账号
    private static String user = "root";
    //主机ip
    private static String host =  "192.168.1.129";
    //密码
    private static String password = "******";
    //上传地址
    private static String directory = "/data/sftp/mysftp";
    //下载目录
    private static String saveFile = "E:/savesftp";

    public SFtpJSch(FtpRedis ftpRedis) {
        this.ftpRedis = ftpRedis;
    }

    private void getConnect(){
        try {
            JSch jsch = new JSch();
            //获取sshSession  账号-ip
            Session sshSession =jsch.getSession(user, host);
            //添加密码
            sshSession.setPassword(password);
            Properties sshConfig = new Properties();
            //严格主机密钥检查
            sshConfig.put("StrictHostKeyChecking", "no");

            sshSession.setConfig(sshConfig);
            //开启sshSession链接
            sshSession.connect();
            //获取sftp通道
            Channel channel = sshSession.openChannel("sftp");
            //开启
            channel.connect();
            sftp = (ChannelSftp) channel;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

   /**
     * sftp下载文件
     */
    public void download() {
        //连接sftp
        getConnect();
        try {
            sftp.cd(directory);
            Vector<ChannelSftp.LsEntry> vector = sftp.ls(directory);
            //遍历目录下所有文件
            for (ChannelSftp.LsEntry lsEntry : vector) {
                //过滤隐藏文件
                if (lsEntry.getFilename().startsWith(".")){
                    continue;
                }
                File localFile = new File(saveFile+File.separator+lsEntry.getFilename());
                sftp.get(lsEntry.getFilename(), new FileOutputStream(localFile));
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值