使用Apache-commons net连接FTP可列文件可上传但无法下载txt文件如何解决
问题排查与解决方案
根因定位
核心错误为方法调用时参数顺序传反,对应逻辑如下:
你定义的downloadFiles方法参数顺序为:
public static FTPFile[] downloadFiles(String host, String username, String password, int port, String localFilePath, String remoteFilePath)
第5位为本地保存路径localFilePath,第6位为FTP服务器远程文件路径remoteFilePath。
但你调用时第5位传入的是FTP上的文件名ambil.txt//ambil.txt,第6位传入的是本地存储路径/storage/emulated/0/Download/hasil.txt,参数完全颠倒。
因此代码执行到创建本地文件流的逻辑时,实际是尝试在安卓系统根目录创建/ambil.txt,而系统根目录属于只读分区,自然抛出Read-only file system的报错,和FTP服务器权限、安卓存储权限无关。
修复方法
调整调用时的参数顺序,将本地保存路径放在第5位,远程文件路径放在第6位即可:
对应第一种调用场景(远程文件为FTP相对路径ambil.txt)
// Try downloading MainAppUtility.downloadFiles(editTextIP.getText().toString(), String.valueOf(editTextUsername.getText()), String.valueOf(editTextPassword.getText()), 21,"/storage/emulated/0/Download/hasil.txt","ambil.txt");
对应第二种调用场景(远程文件为FTP绝对路径/ambil.txt)
// Try downloading MainAppUtility.downloadFiles(editTextIP.getText().toString(), String.valueOf(editTextUsername.getText()), String.valueOf(editTextPassword.getText()), 21,"/storage/emulated/0/Download/hasil.txt","/ambil.txt");
额外优化建议
- 方法参数可增加明确的注解约束,或者保持参数顺序和Apache Commons Net原生API一致,避免后续再出现参数传反的问题
- 方法内创建本地文件前,先判断本地路径的父目录是否存在,不存在则先创建,避免目录不存在导致的下载失败
- 下载逻辑执行完成后,新增FTP连接的logout和disconnect逻辑,避免连接泄漏
内容的提问来源于stack exchange,提问作者Plain_Dude_Sleeping_Alone
相关产品推荐
相关产品推荐

