最近在项目中使用了FTP这个协议去做了文件传输的功能,在本地测试也是通过的,完全没有问题。但是昨天用去用docker部署的时候发生了奇怪的现象,当请求过去的时候,ftp服务器能够连接,文件夹也能够创建,但是就是上传怎么也上传不上去,也没有抛异常。一时间很疑惑。
去查看了很多博客,都说的是要启动被动模式。

    @Bean
    @Scope("prototype")
    public FTPClient getFTPClient(){
        FTPClient  ftpClient = new FTPClient();
        ftpClient.setConnectTimeout(1000*5);
        try {
            ftpClient.connect(url,port);
            ftpClient.login(username,password);
            ftpClient.setControlEncoding("utf-8");
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);//设置文件传输模式为二进制,可以保证传输的内容不会被改变
            //设置被动模式
            ftpClient.enterLocalPassiveMode();
            int replyCode = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(replyCode)){
                log.warn("连接ftp服务器失败!ftp服务器地址:" + url
                        + ", 端口:" + port + ", 初始化工作目录:" + remotedir);
                ftpClient.disconnect();
            }
        } catch (IOException e) {
            log.error("连接ftp服务器发生异常!ftp服务器地址:" + url
                    + ", 端口:" + port + ", 初始化工作目录:" + remotedir + "\n异常信息: " + e.getMessage());
        }
        return ftpClient;

最后在添加了被动模式后,重新打包,docker重新部署上传文件成功了。
强调两个点,一个是docker部署必须开被动模式。第二个是开被动模式必须在连接登录后才能开启,在连接登录之前开启是不起作用的。我一开始就是将被动模式的开启放在了前面,结果上传失败。放在了连接登录后正常运行

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐