Prasanna
Prasanna

Reputation: 71

FTPSClient file upload and download always size 0 and exception

Installed the filezilla server and enabled the FTP over TLS Settings in Settings and started the server. Through eclipse java client i tried to connect to server for upload and download the file using the below code using commons-net apache library.

      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();
    }

It creates a file hello.txt on the server but size is of 0kb (source file size is 10 kb) and ended up the following error. Please help me to resolve this

     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

Upvotes: 0

Views: 2941

Answers (2)

VCeron
VCeron

Reputation: 91

In addition to user2750213's answer ( Filezilla's TLS session resumption ) beware to have the required protocols enabled. You can verify them running this code or this other on the jvm connecting to the FTPS server. Recent versions of Filezilla server use TLSv1.2.

If this works for you, you may get a java.net.SocketException: Unconnected sockets not implemented. In this case you need to write your own class which extends DefaultSocketFactory class and then set it to your FTPS client via method ftpsClient.setSocketFactory(yourSocketFactory) overriding the createSocket() method which must returns a new Socket()

Upvotes: 0

Prasanna
Prasanna

Reputation: 71

just un-tick "Require TLC session resumption on data connection..." in the filezilla server -> settings -> FTP over TLS Settings -> un-tick the Require TLC session resumption on data connection when using PROT P

Upvotes: 1

Related Questions