FTP上传文件到服务器出现连接超时,只能创建文件夹无法创建文件问题,storeFile返回false情况

出现连接超时情况

在排除FTP能与Linux上的服务连接成功的情况下,在代码中加入以下代码开启ftp被动模式

ftpClient.enterLocalPassiveMode();//开启被动模式

ftp连接方式

主动 FTP : 命令连接:客户端 >1024 端口 -> 服务器 21 端口 数据连接:客户端 >1024 端口 <- 服务器 20 端口

被动 FTP : 命令连接:客户端 >1024 端口 -> 服务器 21 端口 数据连接:客户端 >1024 端口 -> 服务器 >1024 端口

FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式。

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

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

通过上面ftp连接方式的解释,我们知道了即使加了这一行代码后也可能出现连接超时的情况,因为我们需要去开放防火墙上的端口,以下是将服务器的1025-65535端口范围全部开放,这样是可行的,但再项目上线时服务器不可能开放这么多端口,所以我们需要去vsftpd.conf配置文件中指定被动传输的端口

firewall-cmd --zone=public --add-port=1025-65535/tcp --permanent

vsftpd.conf

在linux中输入vim /etc/vsftpd/vsftpd.conf即可进入配置文件编辑页面,在vsftpd.conf中最后加入以下几行代码,开放的端口范围自己设置,这里只开放了一个1025端口号

pasv_enable=YES
pasv_min_port=1025
pasv_max_port=1025

这样也就解决了连接超时的问题,但是在本地通过ftp上传文件到服务器的测试是完全可以的,但将项目部署在服务器上又出现了连接超时的情况,通过网上找的方法,说将开启的被动模式移到连接ftp服务器代码之前,也就是以下代码
在这里插入图片描述
这样问题还真解决了,但这样又会出现只能创建文件夹无法写入文件,stroeFile返回false的情况。

解决只能创建文件夹无法创建文件,stroeFile返回false情况

通过找各大博主的方法,大多都是在说被动模式的问题,但是已经在代码中开启被动模式了,那就只能接着找其他博主的解决方法了。

通过寻找又找到了一种说法说可能出现在文件名的情况下,但我的文件上传全都是英文数字,所以排除了这种情况,但还是在这里将这种情况说了出来,也提供了解决方案,这种是解决上传中文文件名返回false的情况

ftpClient.setControlEncoding("UTF-8");
ftpClient.storeFile(new String((fileName).getBytes("UTF-8"), "iso-8859-1"), inputStream);

在用以下解决方案之前,我是根据一个博主将开启被动模式的代码放到连接ftp服务器代码之前的,但这样部署在服务器上是无法创建文件的,在本地测试是可以的,而同时解决连接超时又能创建文件的关键代码在于以下两行

 ftpClient.enterLocalPassiveMode();//开启被动模式
 ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);//设置传输方式为流方式

这就完美解决了,开启被动模式的代码不能放在连接服务器代码的前面!

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值