2

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

1 Answer 1

4

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

1
  • @itro I had faced same problem about two years back and the above solution worked !. Anyway what you can do here is try closing inputstream before calling logout. Commented Jun 27, 2012 at 13:42

Not the answer you're looking for? Browse other questions tagged or ask your own question.