我使用Apache Commons net FTPClient登录并从FTP服务器读取文件。我设法登录,我可以看到它成功登录,因为它显示了标题字符串中的工作目录路径。但是,当我使用listFiles()
时,它没有显示任何文件。 (我也尝试过使用listDirectories()
和listNames()
,但没有成功)
以下是一个片段:
try {
client.connect(ftpHost);
} /*catch (SocketException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}*/ catch (IOException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
String header ="";
InputStream stream=null;
BufferedReader reader=null;
try{
client.login(ftpUser, ftpPass);
client.changeWorkingDirectory(targetWorkingDir);
header = client.printWorkingDirectory();
//client.setFileType(FTP.BINARY_FILE_TYPE);
for(int i=0; i<client.listFiles().length;i++){
header+=client.listFiles()[i].getName() +"\n";
}
}
catch (IOException ex){
ex.printStackTrace();
header="ERROR 1: " + ex.getMessage();
for(int i=0;i<ex.getStackTrace().length;i++){
header += "\n" + ex.getStackTrace()[i];
}
}
catch(NullPointerException e){
header = "ERROR 2: "+ e.getMessage()+"\n";
for(int i=0;i<e.getStackTrace().length;i++){
header+= e.getStackTrace()[i] + "\n";
}
}
finally{
if(reader!=null){
try{reader.close();}catch(IOException e){e.printStackTrace();}
try{stream.close();}catch(IOException e){e.printStackTrace();}
}
}
我也试过用这样的东西来读取文件:
try {
stream = ftpClient.retrieveFileStream("klasa.csv");
reader = new BufferedReader(new InputStreamReader(stream));
header = reader.readLine();
} finally {
if (reader != null) try { reader.close(); } catch (IOException logOrIgnore){}
}
在这两种情况下,我都非常确定我在正确的目录中,并确保我的文件通过FileZilla存在,但客户端似乎无法读取任何文件。< / p>
答案 0 :(得分:0)
尝试避免在循环中调用listFiles()。每个呼叫将执行整个FTP LIST命令序列,因此最终,您将向每个呼叫添加不必要的流量。
您可以先尝试简化程序,如下所示:
private static void ftpTest() {
FTPClient f = new FTPClient();
try {
f.connect("{UOUR FTP SERVER}");
f.login("{USER}", "{PASSWORD}");
FTPFile[] files = f.listFiles(".");
for (FTPFile fi: files) {
System.out.printf("f%s\n", fi.getName());
}
} catch (IOException e) {
e.printStackTrace();
}
}
如果该程序不会为您提供服务器根目录中的文件列表,则可以尝试比较FileZilla FTP选项(尤其是PASSIVE / ACTIVE模式):https://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html#enterLocalPassiveMode()
如果仍然不能解决问题,您可以尝试使用WireShark或tcpdump嗅探网络流量,并将设置的命令与FTP服务器进行比较。