springboot ftp 笔记

    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);linux

            // 获取时间节点
            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);
        }
    }windows

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

既然如此那就多写几个makeDirectory语句便可。测试

好比:.net

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

 

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

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

另外接口的,默认是主动,因此得改为被动模式,须要在ftp.storeFile()前加上 ftp.enterLocalPassiveMode(); 必定是ftp.storeFile()blog

前,不要在实例化时就掉用这个方法无效。像下面这样紧挨着接口

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端口发送链接请求,创建一条数据链路来传送数据。  

相关文章
相关标签/搜索