Home » Android » Android: How can I get the file size of a FTP file via FTPClient?

Android: How can I get the file size of a FTP file via FTPClient?

Posted by: admin May 14, 2020 Leave a comment

Questions:

How can I read the file size of a file that is stored on my ftp server?
I don’t like to implement another libary.

I am working with commons-io-2.4 and commons-net-3.1

Answer and code from talhakosen (thanks!)

private long getFileSize(FTPClient ftp, String filePath) throws Exception {
    long fileSize = 0;
    FTPFile[] files = ftp.listFiles(filePath);
    if (files.length == 1 && files[0].isFile()) {
        fileSize = files[0].getSize();
    }
    Log.i(TAG, "File size = " + fileSize);
    return fileSize;
}
How to&Answers:

Hi you can use the code below,

private void ftpDownload() {
    FTPClient ftp = null;
    try {
        ftp = new FTPClient();
        ftp.connect(mServer);

        try {
            int reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                throw new Exception("Connect failed: " + ftp.getReplyString());
            }
            if (!ftp.login(mUser, mPassword)) {
                throw new Exception("Login failed: " + ftp.getReplyString());
            }
            try {
                ftp.enterLocalPassiveMode();
                if (!ftp.setFileType(FTP.BINARY_FILE_TYPE)) {
                    Log.e(TAG, "Setting binary file type failed.");
                }
                transferFile(ftp);
            } catch(Exception e) {
                handleThrowable(e);
            } finally {
                if (!ftp.logout()) {
                    Log.e(TAG, "Logout failed.");
                }
            }
        } catch(Exception e) {
            handleThrowable(e);
        } finally {
            ftp.disconnect();
        }
    } catch(Exception e) {
        handleThrowable(e);
    }
}

private void transferFile(FTPClient ftp) throws Exception {
    long fileSize = getFileSize(ftp, mFilePath);
    InputStream is = retrieveFileStream(ftp, mFilePath);
    downloadFile(is, buffer, fileSize);
    is.close();

    if (!ftp.completePendingCommand()) {
        throw new Exception("Pending command failed: " + ftp.getReplyString());
    }
}

private InputStream retrieveFileStream(FTPClient ftp, String filePath)
throws Exception {
    InputStream is = ftp.retrieveFileStream(filePath);
    int reply = ftp.getReplyCode();
    if (is == null
            || (!FTPReply.isPositivePreliminary(reply)
                    && !FTPReply.isPositiveCompletion(reply))) {
        throw new Exception(ftp.getReplyString());
    }
    return is;
}

private byte[] downloadFile(InputStream is, long fileSize)
throws Exception {
    byte[] buffer = new byte[fileSize];
    if (is.read(buffer, 0, buffer.length)) == -1) {
        return null;
    }
    return buffer; // <-- Here is your file's contents !!!
}

private long getFileSize(FTPClient ftp, String filePath) throws Exception {
    long fileSize = 0;
    FTPFile[] files = ftp.listFiles(filePath);
    if (files.length == 1 && files[0].isFile()) {
        fileSize = files[0].getSize();
    }
    Log.i(TAG, "File size = " + fileSize);
    return fileSize;
}

Answer:

If the server does not allow the client to list the files. you can try size cmd.
please see Extensions to FTP RFC3659 for the size FTP cmd syntax.
you also can use the following function example.

private long getRemoteSize(FTPClient client, String remoteFilePath) throws Exception {
    client.sendCommand("SIZE", remoteFilePath);
    String[] reply = client.getReplyStrings();
    String[] response = reply[0].split(" ");
    if(client.getReplyCode() != 213){
      throw new Exception(String.format("ftp client size cmd response %d",client.getReplyCode()));
    }
    return Long.parseLong(response[1]);
  };

Answer:

private long getFileSize(FTPClient ftpClient, String fileName) throws Exception 
{
   long fileSize = 0;
   String fileName; 
   //down file name 
   FTPFile[] files = ftpClient.listFiles(); //ftp list
   for ( i = 0; i < files.length; i++)
   { //ftp connect forder in files              
      if (fileName == files[i].getName())
      { 
        fileSize = files[i].getSize();
        return fileSize;
      }
   }         
}