Apache Commons FTP problems

10,415

Solution 1

Change the following:

boolean xxx=client.setFileTransferMode(FTPClient.BINARY_FILE_TYPE);

Should be:

boolean xxx=client.setFileType(FTP.BINARY_FILE_TYPE);

You have confused FileTransferModes with FileTypes.

The available FileTypes are:

The available FileTransferModes are:

I suppose if apache introduced enums for these constant types, then this kind of problem could be avoided, but then the library would not be available to pre-java-5 runtimes.
I wonder how much of an issue java 1.4 compatibility really is.

Solution 2

If only the text file was transferred successfully, I suspect you need to set the binary transfer file type.

See the setFileType method to see how to do this.

The commons-net wiki mentions this is the cause of most file corruption issues.

Share:
10,415

Related videos on Youtube

Igor
Author by

Igor

Updated on July 11, 2022

Comments

  • Igor
    Igor almost 2 years

    I want to implement a FTP Client with Apache Commons Net only for uploading data. The Connection and Login to FTP-Server works fine. But the upload does not work right. The files are a little to big as the originals. And the files are damaged. I tried an image, a video and a textfile. Only the textfile is alright.

    Now I see while debugging

    boolean tmp=client.setFileTransferMode(FTPClient.BINARY_FILE_TYPE);
    

    gives me false. So it can not be set. Why? (Maybe this is not the problem?)

    Here a the rest of my code

    client=new FTPClient();
    
        try {           
            int reply;
            client.connect(url, port);
            reply = client.getReplyCode();
    
            if (!FTPReply.isPositiveCompletion(reply))
            {
                client.disconnect();
                System.err.println("FTP server refused connection.");
                System.exit(1);
            }
    
    
            client.login(user, pw);
            boolean xxx=client.setFileTransferMode(FTPClient.BINARY_FILE_TYPE);
            client.setControlKeepAliveTimeout(300);
            client.enterLocalPassiveMode();
    
    if (client.isConnected())
        {
        try {
            File file=new File(<FILE>);
            FileInputStream inputStream = new FileInputStream(file);
            OutputStream outputStream = client.storeFileStream(file.getName());
    
              byte[] buffer = new byte[4096];
              int l;
           while((l = inputStream.read(buffer))!=-1)
                   {
                    outputStream.write(buffer, 0, l);
                }
    
              inputStream.close();
              outputStream.flush();
              outputStream.close();}
    
  • Igor
    Igor almost 13 years
    Hi, I tried it, but the method gives me false, so the Mode can not be set.
  • MacAnthony
    MacAnthony almost 13 years
    You tried this some where after the connect method was called?
  • MacAnthony
    MacAnthony almost 13 years
    And also after the login method.
  • Jesse Webb
    Jesse Webb almost 13 years
    He tried the setFileTransferMode, not the setFileType method you suggested. This is a correct answer.