最近在项目中使用了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部署必须开被动模式。第二个是开被动模式必须在连接登录后才能开启,在连接登录之前开启是不起作用的。我一开始就是将被动模式的开启放在了前面,结果上传失败。放在了连接登录后正常运行