Проблема в том, что иногда в полученном файле отсутствуют некоторые байты в конце.
Этого не происходит при использовании InputStream/
Код: Выделить всё
OutputStreamЭто не проблема файла: я тестировал множество разных файлов с одинаковыми результатами.
Это не проблема сервера: Я тестировал на двух разных - одинаковые результаты.
Это даже не похоже на проблему с подключением: тестировал на двух разных соединениях, одна и та же проблема.
И более того, похоже, это не проблема. проблема конкретно с Apache FTPClient: я пробовал старый ftp4j и выдает одинаково недостающие байты ближе к концу файла.
Насколько я понимаю, это InputStream.read(), который не выполняет свою работу должным образом, пропуская один байт в конце файла. конец некоторых буферов.
Код: Выделить всё
import org.apache.commons.net.ftp.FTPClient
fun downloadFile(remotePath: String, outputFile: File) {
val client = FTPClient()
client.connect("ftp.example.com")
client.login("username", "password")
client.enterLocalPassiveMode()
println(client.getSize(remotePath)) // Say 100000 bytes
//client.setFileType(FTP.BINARY_FILE_TYPE) // Doesn't matter
client.retrieveFileStream(remotePath).use { inputStream ->
outputFile.outputStream().use { outputStream ->
val buffer = ByteArray(DEFAULT_BUFFER_SIZE) // 8 * 1024
var bytes: Int
while (inputStream.read(buffer).also { bytes = it } != -1) {
outputStream.write(buffer, 0, bytes)
}
}
}
client.completePendingCommand()
client.disconnect()
println(outputFile.length()) // Usually 100000, other times 99999 or less bytes
}
Код: Выделить всё
lifecycleScope.launch(Dispatchers.IO) {
downloadFile("/path/to/input.zip", File(cacheDir, "output.zip"))
}
Очевидно, что файл большего размера и с большей вероятностью будет поврежден.< /p>
Как правильно получить двоичный файл через FTP?
Подробнее здесь: https://stackoverflow.com/questions/792 ... le-via-ftp
Мобильная версия