在本地测试的时候,可以正常发送ftp,但是部署到服务器上却不行,总结了几个方法,希望能对大家有帮助!
大致的表现有:
1.程序卡在发送那里,获取不到结果,也不报错
2.上传的文件大小为零,可以通过filezilla.exe删除
3.上传的文件大小为零,没法通过通过filezilla.exe删除,这个实际上是乱码导致的
方法一
在代码里添加,一般来说开启了被动模式,应该就可以正常的发过去了
ftpClient.enterLocalPassiveMode();// 被动模式
方法二
还有可能是防火墙的问题,可以先将服务器的防火墙关闭,然后发送,如果能正常发送,那基本确认是防火墙的问题了,大家可以通过这个步骤来通过防火墙1.重新打开防火墙,2.打开这两个开关,3.重新发送,这个时候会弹出来是否允许ftp访问内网还是外网,点同意就可以了
方法三
也可以尝试对文件名称进行编码,下面的代码开启了UTF-8的编码,这样就可以直接对文件名称进行编码
if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {
// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
LOCAL_CHARSET = "UTF-8";
}
String fileName2 = new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
方法四
后来又发现FTP发送有时可以成功,有时会失败,但是再次上传会成功,建议在发送的地方进行判断,循环的发送,
// 上传文件到FTP服务器
private static void uploadFile(FTPClient ftpClient, String remoteFolderPath, String fileName, ByteArrayInputStream byteArrayInputStream) throws IOException {
String remoteFilePath = remoteFolderPath + "/" + fileName;
int maxRetryCount = 3;
int retryCount = 0;
while (retryCount < maxRetryCount) {
boolean success = ftpClient.storeFile(remoteFilePath, byteArrayInputStream);
if (success) {
break; // 文件上传成功,退出循环
} else {
log.error("FTP服务器上传文件失败。文件名称:" + fileName);
retryCount++;
log.error("尝试重新上传,次数:" + retryCount);
if (retryCount >= maxRetryCount) {
log.error("已达到最大重试次数,上传失败。");
} else {
// 重新创建 ByteArrayInputStream,因为上一次的已经被消耗
byteArrayInputStream.reset();
}
}
}
}
上面的方法不一定哪个有效,建议一起尝试一下。
3.28更新
某大佬补充了另外一种解决方法,适用于下面的错误:
java.net.ConnectException: Connection refused: connect
at java.base/sun.nio.ch.Net.connect0(Native Method)
at java.base/sun.nio.ch.Net.connect(Net.java:579)
at java.base/sun.nio.ch.Net.connect(Net.java:568)
at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:588)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327)
at java.base/java.net.Socket.connect(Socket.java:633)
at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:920)
at org.apache.commons.net.ftp.FTPClient._storeFile(FTPClient.java:653)
at org.apache.commons.net.ftp.FTPClient.__storeFile(FTPClient.java:639)
at org.apache.commons.net.ftp.FTPClient.storeFile(FTPClient.java:2030)
at cn.hutool.extra.ftp.Ftp.upload(Ftp.java:566)
... 119 common frames omitted
可以通过使用高版本的commons-net来解决;