springboot ftp 笔记

不羁岁月 提交于 2020-03-02 03:47:34

    private boolean uploadFile() {
        try {
            StopWatch watch = new StopWatch();
            watch.start();
            // 创建一个ftp对象
            FTPClient ftp = new FTPClient();
            //ftp.setControlEncoding("GBK");
            // ftp连接上去
            ftp.connect(ftpHost, ftpPort);
            // ftp登录上去
            ftp.login(ftpUsername, ftpPassword);
            // 拿到返回码,进行判断是否连接成功
            Integer reply = ftp.getReplyCode();
            // 连接失败
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return false;
            }
            // 连接成功,准备上传
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);

            // 获取时间节点
            Date now = new Date();
            SimpleDateFormat formatFile = new SimpleDateFormat("yyyy-MM-dd");
            String dateName = formatFile.format(now);
            String dirName = String.format("/%s/%s", "OverDueStatic", dateName);
            boolean makeResult = ftp.makeDirectory(dirName);
            boolean changeResult = ftp.changeWorkingDirectory(dirName);
            FileInputStream fis = new FileInputStream(String.format("%1$s/%2$s/%2$s.xlsx", excelPath, dateName));
            boolean storeResult = ftp.storeFile(String.format("%s/%s.xlsx", dirName, dateName), fis);
            fis.close();
            watch.stop();
            log.info(String.format("上传文件至ftp完成,耗时:%s", watch.getLastTaskTimeMillis()));
            return true;
        } catch (Exception e) {
            // TODO: handle exception
            throw new RuntimeException(e);
        }
    }

这是上传的相关代码,但是在makeDirectory方法一直返回false,后来查下资料才发现,这玩意不能创建多级目录,只能一层一层创建。

既然如此那就多写几个makeDirectory语句即可。

比如:

boolean makeResult = ftp.makeDirectory("/aa/");
boolean makeResult1 = ftp.makeDirectory("/aa/bb/");

 

踩坑:程序部署在linux服务器上,在windows上测试上传没问题,放到linux就出现在上传卡死的情况,不报错,不执行,无反应。

ftp.storeFile() 就是这个方法这里卡死,后来百度了下,说是因为在linux有主动和被动模式,linux有端口限制真正传输数据是通过

另外接口的,默认是主动,所以得改成被动模式,需要在ftp.storeFile()前加上 ftp.enterLocalPassiveMode(); 一定是ftp.storeFile()

前,不要在实例化时就掉用这个方法无效。像下面这样紧挨着(其实登录(login方法)成功后就可以设置了),一定要加上,不管主动还被动。

ftp.enterLocalPassiveMode();
boolean storeResult = ftp.storeFile()

 

再提一点,如果服务器存在这个文件没删除权限是无法覆盖掉的。

参考地址:https://blog.csdn.net/afei3418/article/details/54375858

1) 控制连接

客户端希望与FTP服务器建立上传下载的数据传输时,它首先向服务器的TCP 21端口发起一个建立连接的请求,FTP服务器接受来自客户端的请求,完成连接的建立过程,这样的连接就称为FTP控制连接。

2) 数据连接

FTP控制连接建立之后,即可开始传输文件,传输文件的连接称为FTP数据连接。FTP数据连接就是FTP传输数据的过程,它有两种传输模式
PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了XXXX端口,你过来连接我”。于是服务器从20端口向客户端的XXXX端口发送连接请求,建立一条数据链路来传送数据。

PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求,建立一条数据链路来传送数据。
 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!