我正在使用Apache的库编写一个非常简单的FTPClient应用程序。
我所做的就是从服务器下载一个jar文件。没有例外,当我在MacOS上运行时,应用程序正常工作,并且当我在Windows中运行相同的代码时,下载的文件小于服务器上的文件。但是,没有例外,一切似乎都很好。
我疯了,我使用二进制模式而且代码非常简单我无法相信自从昨天以来我一直坚持使用它!
请帮忙!
public boolean loadLatest(){
FTPClient ftp = new FTPClient();
try {
ftp.connect("server address");
ftp.setControlKeepAliveTimeout(300);
ftp.enterLocalPassiveMode();
String fu = "username";
ftp.login(fu, "password");
int reply = ftp.getReplyCode();
if (FTPReply.isPositiveCompletion(reply)) {
ftp.setFileTransferMode(FTP.BINARY_FILE_TYPE);
ftp.enterLocalPassiveMode();
FTPFilter filter = new FTPFilter();
FTPFile[] finfo = ftp.listFiles(".",filter);
if (finfo.length==0){
return false;
}
File currentJar = new File("sm.jar");
FileOutputStream output;
output = new FileOutputStream("sm.jar");
if (ftp.retrieveFile(finfo[0].getName(), output)==false){
System.out.println("Bad file!");
}
output.close();
ftp.logout();
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
这是我的代码:
由于
答案 0 :(得分:1)
您可能误用了Apache API。
public boolean setFileTransferMode(int mode) throws IOException
设置传输模式。默认传输模式FTP.STREAM_TRANSFER_MODE如果从未调用此方法或调用connect方法。
可能的值为STREAM_TRANSFER_MODE
,STREAM_TRANSFER_MODE
或BLOCK_TRANSFER_MODE
。
所以你的行如下:
ftp.setFileTransferMode(FTP.BINARY_FILE_TYPE);
不是否有效使用API,并且未将客户端设置为以BINARY
模式运行。
您调用的FTP传输模式实际上是由另一种方法控制的:
public boolean setFileType(int fileType) throws IOException
设置要传输的文件类型。这应该是
FTP.ASCII_FILE_TYPE
,FTP.BINARY_FILE_TYPE
等之一。只有在您想要更改类型时才需要设置文件类型。更改后,新类型将一直有效,直到您再次更改它为止。如果从不调用此方法,则默认文件类型为FTP.ASCII_FILE_TYPE
。 服务器默认值应为ASCII(请参阅RFC 959),但许多ftp服务器默认为BINARY。为确保所有服务器都能正常运行,请在连接服务器后始终指定相应的文件类型。N.B。当前正在调用任何连接方法会将类型重置为
FTP.ASCII_FILE_TYPE
。
最有可能的是,您需要使用最后一种方法将模式更改为BINARY
,并且传输应该没问题。