我有一个用于验证FTP目录的API,如下所示:
public boolean validateDirectory(FtpLocation ftpLocation) throws CustomException{
FTPClient client = new FTPClient();
try {
client.connect(ftpLocation.getSystem(), Integer.parseInt(ftpLocation.getPort()));
client.login(ftpLocation.getUser(), ftpLocation.getPassword());
client.changeWorkingDirectory(ftpLocation.getDirPath());
int returnCode = client.getReplyCode();
if (returnCode == 550) {
LOG.error("Directory ["+ ftpLocation.getDirPath() + "] does not exist");
return false;
}
File dir = new File(ftpLocation.getDirPath());
if(dir!=null){
if (!dir.canRead()) {
LOG.error("Directory ["+ ftpLocation.getDirPath() + "] does not have read permission");
return false;
}
}
return true;
} catch (NumberFormatException | IOException e) {
LOG.error("Failed to validate Source Directory Path [" + ftpLocation.getDirPath() + "]", e);
throw new CustomException("Failed to validate Source Directory Path [" + ftpLocation.getDirPath() + "]", e);
} finally {
try {
client.disconnect();
} catch (IOException e) {
LOG.warn("Error occured while disconnecting FTPClient", e);
}
}
}
我的FTP根 / (绝对路径/ home / soumya )
我想从 / source (绝对路径/ home / soumya / source )路由文件
我在测试API时发现了以下行为:
以上四种情况的日志如下:
07:41:59.799 [pool-2-thread-1] ERROR c.n.d.m.b.f.Validator - Directory [/source] does not have read permission
07:42:48.801 [pool-2-thread-1] ERROR c.n.d.m.b.f.Validator - Directory [/source] does not have read permission
07:43:27.093 [pool-2-thread-1] ERROR c.n.d.m.b.f.Validator - Directory [/source] does not exist
07:44:00.215 [pool-2-thread-1] ERROR c.n.d.m.b.f.Validator - Directory [/source] does not exist
问题:
注意: Camel版本 2.12.1
答案 0 :(得分:0)
我找到了解决问题的方法,如下所示:
public void validateDirectory(FtpLocation ftpLocation) throws CustomException {
FTPClient client = new FTPClient();
try {
client.connect(ftpLocation.getSystem(), Integer.parseInt(ftpLocation.getPort()));
client.login(ftpLocation.getUser(), ftpLocation.getPassword());
client.enterLocalPassiveMode();
client.changeWorkingDirectory(ftpLocation.getDirPath());
int returnCode = client.getReplyCode();
LOG.debug("FTP return code: "+ returnCode);
if (returnCode == 550) {
LOG.error("Directory ["+ ftpLocation.getDirPath() + "] does not exist");
throw new CustomException("Directory ["+ ftpLocation.getDirPath() + "] does not exist");
}
String targetDir = client.printWorkingDirectory();
client.cdup();
targetDir = StringUtils.substring(targetDir, StringUtils.lastIndexOf(targetDir, File.separator) + 1);
FTPFile ftpFiles[] = client.listFiles();
for(FTPFile ftpFile : ftpFiles){
if(StringUtils.equals(ftpFile.getName(), targetDir) && !ftpFile.hasPermission(FTPFile.USER_ACCESS, FTPFile.READ_PERMISSION)){
LOG.error("No read permission for directory [" + ftpLocation.getDirPath() + "]");
throw new CustomException("No read permission for directory [" + ftpLocation.getDirPath() + "]");
}
}
} catch (NumberFormatException | IOException e) {
LOG.error("Failed to validate Source Directory Path [" + ftpLocation.getDirPath() + "]", e);
throw new CustomException("Failed to validate Source Directory Path [" + ftpLocation.getDirPath() + "]", e);
} finally {
try {
client.disconnect();
} catch (IOException e) {
LOG.warn("Error occured while disconnecting FTPClient", e);
}
}
}
但是,如果您有更好的解决方案,请发布。