在本地测试的时候,可以正常发送ftp,但是部署到服务器上却不行,总结了几个方法,希望能对大家有帮助!

大致的表现有:

1.程序卡在发送那里,获取不到结果,也不报错
2.上传的文件大小为零,可以通过filezilla.exe删除
3.上传的文件大小为零,没法通过通过filezilla.exe删除,这个实际上是乱码导致的

方法一

在代码里添加,一般来说开启了被动模式,应该就可以正常的发过去了

ftpClient.enterLocalPassiveMode();// 被动模式
方法二

还有可能是防火墙的问题,可以先将服务器的防火墙关闭,然后发送,如果能正常发送,那基本确认是防火墙的问题了,大家可以通过这个步骤来通过防火墙1.重新打开防火墙,2.打开这两个开关,3.重新发送,这个时候会弹出来是否允许ftp访问内网还是外网,点同意就可以了

java sftp上传和删除文件 java ftp 上传文件_linux

方法三

也可以尝试对文件名称进行编码,下面的代码开启了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来解决;

java sftp上传和删除文件 java ftp 上传文件_java_02