当前位置: 首页 > 知识库问答 >
问题:

FTPSClient文件上载和下载始终大小为0且异常

尉迟明贤
2023-03-14

安装filezilla服务器,并启用设置中的TLS设置的FTP,并启动服务器。通过eclipse java客户端,我试图连接到服务器上传和下载文件,使用下面的代码使用Commons-net apache库。

      FTPSClient ftpClient = new FTPSClient(false);     
      // Connect to host
      ftpClient.connect(mServer, mPort);
      int reply = ftpClient.getReplyCode();
      System.out.println("The reply code is "+reply);
      if (FTPReply.isPositiveCompletion(reply)) {

        // Login
        if (ftpClient.login("******", "*******")) {
          // Set protection buffer size
          ftpClient.execPBSZ(0);
          // Set data channel protection to private
          ftpClient.execPROT("P");
          // Enter local passive mode
          ftpClient.enterLocalPassiveMode();


            // Upload File using storeFile
            File firstLocalFile = new File("e:/Test.txt");
            String firstRemoteFile = "hello.txt";
            InputStream is = new FileInputStream(firstLocalFile);
            String result = getStringFromInputStream(is);
            System.out.println(result);

            Object output = ftpClient.storeFile(firstRemoteFile, is);
            System.out.println(output);
            is.close();

            // Download File using retrieveFile(String, OutputStream)
            String remoteFile1 = "/settings.xml";
            File downloadFile1 = new File("e:/testOutput.xml");
            OutputStream outputStream1 = new BufferedOutputStream(new FileOutputStream(downloadFile1));
            boolean success = ftpClient.retrieveFile(remoteFile1, outputStream1);
            outputStream1.close();

            if (success) {
                System.out.println("File #1 has been downloaded successfully.");
            }




      // Logout
      ftpClient.logout();

    // Disconnect
        ftpClient.disconnect();

        } else {
          System.out.println("FTP login failed");
        }

        // Disconnect
        ftpClient.disconnect();

      } else {
        System.out.println("FTP connect to host failed");
      }
    } catch (IOException ioe) {
      System.out.println("FTP client received network error");
      ioe.printStackTrace();
    } catch (Exception nsae) {
      System.out.println("FTP client could not use SSL algorithm");
      nsae.printStackTrace();
    }

它在服务器上创建了一个文件hello.txt,但大小为0kb(源文件大小为10kb),并以以下错误结束。请帮助我解决这个问题

     javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at org.apache.commons.net.ftp.FTPSClient._openDataConnection_(FTPSClient.java:619)
at org.apache.commons.net.ftp.FTPClient._storeFile(FTPClient.java:633)
at org.apache.commons.net.ftp.FTPClient.__storeFile(FTPClient.java:624)
at org.apache.commons.net.ftp.FTPClient.storeFile(FTPClient.java:1976)
at com.test.ftps.TestClass.main(TestClass.java:88)
  Caused by: java.io.EOFException: SSL peer shut down incorrectly
at sun.security.ssl.InputRecord.read(Unknown Source)
... 9 more

共有2个答案

谷梁子昂
2023-03-14

除了user2750213的答案(Filezilla的TLS会话恢复)之外,还要注意启用所需的协议。您可以在连接到FTPS服务器的jvm上验证它们是否运行此代码或其他代码。Filezilla服务器的最新版本使用TLSv1。2.

如果这对你有效,你可能会得到一个java。网SocketException:未实现未连接的套接字。在这种情况下,您需要编写自己的类来扩展DefaultSocketFactory类,然后通过方法ftpsClient将其设置到FTPS客户端。setSocketFactory(yourSocketFactory)重写createSocket()方法,该方法必须返回一个新的Socket()

金承嗣
2023-03-14

只需取消勾选“需要在数据连接上恢复TLC会话…”在filezilla服务器中-

 类似资料:
  • 使用Apache Commons FTPSClient,下载的文件始终存储为0字节。我尝试了不同的方法,但在存储的文件中总是得到0字节。在下面的代码中,我展示了这三种方法。 以下是使用的代码:

  • 我正在用Spring Boot 2.1.3(使用标准的Tomcat嵌入式web服务器)开发一个endpoint来上载图像,我想限制多部分上载的大小。我可以通过以下属性轻松完成此操作: 但是我总是得到Spring无法捕获的500,因为Tomcat正在抛出异常并且请求无法到达我在RestController中的代码。 我的ExceptionHandler是这样的,但无论注释中出现什么异常,它显然都不起

  • 我有一个文件表示为块的列表,目标是下载所有块,加入并保存为一个文件。 它应该适用于大文件 应该是跨浏览器解决方案 null null null null 但我仍然无法实现我的目标与涵盖的需求… 如果有人有经验,最好的解决方案,我恳请分享它在这里。谢谢

  • 问题内容: 有没有一种方法可以获取远程文件http://my_url/my_file.txt的大小而无需下载文件? 问题答案: 在这里找到有关此的一些信息: 这是(我发现)获取远程文件大小的最佳方法。请注意,HEAD请求不会获取请求的实际主体,它们只是检索标头。因此,对100MB的资源进行HEAD请求所花费的时间与对1KB的资源进行HEAD请求所花费的时间相同。 用法:

  • 问题内容: 基本上,我想确定是否应该使用AJAX下载文件,具体取决于文件大小。 我猜这个问题也可以表述为:我如何仅获取ajax请求的标头? 编辑 :评论中的ultima-rat0告诉了我两个已经被问到的显然与这个相同的问题。它们非常相似,但是都需要jQuery。我想要一个非jQuery解决方案。 问题答案: 您可以手动获取XHR响应头数据: http://www.w3.org/TR/XMLHttp

  • 我正在下载PDF文件从服务器使用骆驼SFTP组件。有时它是下载零大小的文件。但实际大小为4KB。我认为camel正在下载文件,而文件正在编写。请让我知道如何下载文件后,文件写入操作完成。举个例子。