Hi everyone!
This is my first time using a mailing list, so sorry in advance if I mess something up! I'm using version 3.6 of the "Net" Library, in combination with Java 8, Android Studio 3.6.1 (min SDK=24, target SDK=27) and I'm experiencing a weird issue with file download: Downloading small images (jpg, around 12kb each) or text files from my FTP server always succeeds but I've also got bigger images (png, 2000x2000, around 8-9mb each) and they only download partially: I pulled them from the emulator/device and they end up with a black, horizontal bar at the bottom and they're smaller than they should be (see below for examples). I tested my code with 'ftpClient.retrieveFile()' (version 1) and 'ftpClient.retrieveFileStream()' (version 2, InputStream or BufferedInputStream) but I get the same result with both: public void downloadFiles(String remoteFolder, String localFolder, ArrayList<String> filenames) { //This runs inside an 'AsyncTask'! //login here ftpClient.setConnectTimeout(10000); ftpClient.setDefaultTimeout(30000); OutputStream out = null; try { ftpClient.enterLocalPassiveMode(); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); if(ftpClient.changeWorkingDirectory(remoteFolder)) { for(String filename : filenames) { FTPFile[] singleFile = ftpClient.listFiles(filename); if(singleFile.length > 0) { //check if file exists String localPath = localFolder + File.separator + filename; out = new FileOutputStream(localPath); //Version 1: /*if(!ftpClient.retrieveFile(filename, out)) { //Set error message here out.close(); break; } out.close();*/ //Version 2: InputStream is = ftpClient.retrieveFileStream(filename); BufferedInputStream bis = new BufferedInputStream(is); byte[] buf = new byte[10000000]; int len; while ((len = bis.read(buf)) > 0) { //Same result using only 'is' out.write(buf, 0, len); } if(ftpClient.completePendingCommand()) { Log.d(TAG,"DONE"); //This is always printed, even when the files aren't complete } else { Log.d(TAG,"NOT DONE"); } out.close(); bis.close(); } else { //Another error message here break; } } } } catch (IOException e) { //And another error message here } finally { try { if(out!=null) { out.close(); } } catch(IOException e) { //Doesn't matter } } //logout here } I printed the full length (added up 'len') and only very rarely it manages to download everything, usually there are a couple of bytes missing (always less than 10 so far) - example: File 1 is 8965167 bytes (according to Windows' file explorer) but the added up 'len' is only 8965165 or 8965161 or . File 2 is 8972047 bytes but it only downloads 8972044 or 8972038 or . Did I miss anything, some type of setting for bigger files? How do I make it download the full images? Thanks in advance for any tip!