当我们通过FTP下载文件时,一般先会切换目录,也就是
ftpClient.changeWorkingDirectory(ftpPath);
这里有一个容易被忽视的问题。虽然我们在业务代码顶上已经提前切换了目录,等经过几个循环或者十几行代码后,如果我们直接通过文件名下载该目录下的文件,下载有可能会失败。像这种情况我们一般会认为是文件有中文或者编码不一致的问题。其实不然,这可能是FTP的目录切换失效了,以下是已经切换了目录的下载代码,这里可能会出现文件找不到的情况。
File localFile = new File(localPath + fileName);
os = new FileOutputStream(localFile);
FTPFile[] a=ftpClient.listFiles(fileName);
if (a.length>0){
ftpClient.retrieveFile(fileName, os);
}else{ ftpClient.retrieveFile(new String(fileName.getBytes(StandardCharsets.UTF_8),StandardCharsets.ISO_8859_1), os);
}
所以最好在下载文件方法前面,再切换一次目录也就是
File localFile = new File(localPath + fileName);
os = new FileOutputStream(localFile);
ftpClient.changeWorkingDirectory(ftpPath);
FTPFile[] a=ftpClient.listFiles(fileName);
if (a.length>0){
ftpClient.retrieveFile(fileName, os);
}else{ ftpClient.retrieveFile(new String(fileName.getBytes(StandardCharsets.UTF_8),StandardCharsets.ISO_8859_1), os);
}
这样就可以避免文件找不到导致文件下载失败的问题