背景介绍:
需求用定时任务,将FTP的图片转换成Base64字符串发送出去。
出现问题点:开发时先将FTP图片下载到本地电脑,部署时下载到项目部署的服务器。
起初在开发环境运行完美,正常下载并转码,可是部署到服务器时,从FTP下载的文件大小为 0 了,也就是文件内容为空。
原因:操作系统不同
开发环境系统为Windows,在跑代码时,FTP连接默认为主动模式,可正常下载上传。被动模式则不行。
服务器系统为Linux,在跑代码时,FTP连接模式要设置为被动模式,才可正常下载上传。
解决方案示例:
此处用的时HuTool工具包里的FTP工具
Ftp ftp = new Ftp(ftpHost, ftpPort, ftpUser, ftpPassword);
//切换为被动模式
ftp.setMode(FtpMode.Passive);
设为被动模式连接后,重新部署即可。
Tip: FTP两种连接模式:主动模式(Active FTP)和被动模式(Passive FTP)
在主动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,然后开放N+1号端口进行监听,并向服务器发出PORT N+1命令。服务器接收到命令后,会用其本地的FTP数据端口(通常是20)来连接客户端指定的端口N+1,进行数据传输。
在被动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,同时会开启N+1号端口。然后向服务器发送PASV命令,通知服务器自己处于被动模式。服务器收到命令后,会开放一个大于1024的端口P进行监听,然后用PORT P命令通知客户端,自己的数据端口是P。客户端收到命令后,会通过N+1号端口连接服务器的端口P,然后在两个端口之间进行数据传输。
总的来说,主动模式的FTP是指服务器主动连接客户端的数据端口,被动模式的FTP是指服务器被动地等待客户端连接自己的数据端口。
被动模式的FTP通常用在处于防火墙之后的FTP客户访问外界FTP服务器的情况,因为在这种情况下,防火墙通常配置为不允许外界访问防火墙之后的主机,而只允许由防火墙之后的主机发起的连接请求通过。因此,在这种情况下不能使用主动模式的FTP传输,而被动模式的FTP可以良好的工作。
评论前必须登录!
注册