Search code examples
javaapachefile-ionetwork-programmingftp-client

Why uploaded file through Apache FTPClient is smaller then original file on the local?


I am uploading files(.cvs,.zip,.rar,.doc,.png,.jpg...) to ftp server. The strange is everything is successfully but I miss some data.

Does any body know why it happens and how to fix it?

 public static void uploadWithCommonsFTP(File fileToBeUpload) {
        FTPClient f = new FTPClient();
        try {
            f.connect(server.getServer());
            f.login(server.getUsername(), server.getPassword());
            f.changeWorkingDirectory("user");
            f.setFileType(FTP.BINARY_FILE_TYPE);
            f.setFileTransferMode(FTP.BINARY_FILE_TYPE);//this is part of Mohammad Adil's solutions
            f.enterLocalPassiveMode();
            ByteArrayInputStream in = new ByteArrayInputStream(FileUtils.readFileToByteArray(fileToBeUpload));
            boolean reply = f.storeFile(fileToBeUpload.getName(), in);
            if(!f.completePendingCommand()) {
                    f.logout();
                    f.disconnect();
                    System.err.println("File transfer failed.");
                    System.exit(1);
                }
                if(reply){
                    JOptionPane.showMessageDialog(null,"uploaded successfully.");
                }else{
                    JOptionPane.showMessageDialog(null,"Upload failed.");
                }
            }
            //Logout and disconnect from server
            in.close();//this is part of Mohammad Adil's solutions
            f.logout();
            f.disconnect();
        } catch (IOException e) {
            e.printStackTrace();
        }
}

Solution

  • It's often forgotten that FTP has two modes of operation - one for text files and the other for binary(jpg,csv,pdf,zip) files.

    Your code doesn't work because the default transfer mode for FTPClient is FTP.ASCII_FILE_TYPE. You just need to update the configuration to transfer in binary mode.

    Add this in your code :

    f.setFileTransferMode(FTP.BINARY_FILE_TYPE);
    

    just put that line after f.setFileType(FTP.BINARY_FILE_TYPE); and it should work then.

    EDIT:

    You are not closing inputStream in your code,Just call in.close() before calling logout()