我正在使用com.enterprisedt.net.ftp jar将FTP文件发送到远程位置。我的代码看起来像
try{
ftp.mkdir(actDirToSearch);
}catch(Exception e){
Log.addInLog(Log.ERR,e.getMessage());
}
ftp.chdir(actDirToSearch);
try{
ftp.put(tarStream, fileName);
}
catch(Exception ex){
throw new FTPException(ex.getMessage());
}
}catch(FTPException e){
throw e;
}catch(IOException e){
throw e;
}finally{
try {
if(ftp != null){
ftp.quit();
}
}
此外,我正在使用此代码将tar.gz文件上传到具有RHEL 5.4和6的2个不同的远程计算机。但有时我收到成功的消息,有时tar.gz文件在远程计算机上上载较小的内容后会损坏。在调试时我发现了如果我停在if(ftp!= null)行,然后经过一段时间后我执行ftp.quit()的行为,它将始终成功。我已经看过ftp代码,我发现没有单独的线程来ftp tar.gz文件。它全部串行执行。我的疑问是为什么这个tar.gz文件变得腐败,为什么我在调试时成功了?
vsftpd服务正在这两台机器上运行。此外,当从终端手动执行ftp时,它成功了。 Java版本是1.6。
答案 0 :(得分:1)
检查您的FTP设置 - 大多数FTP实现都有文件类型的设置;如果它是文本,二进制,或者实现是否应该自己确定它是什么类型。
回应评论:
我不太熟悉FTP协议,但我知道FTP客户端通常有" text"或者"二进制"文件,以及客户端通过查看其中的第一个字节来确定正在传输哪种文件的选项。我希望这是客户端传递给服务器的东西,这样服务器就可以做一些事情,比如将行尾将一行字节转换为服务器特定操作系统的正确字节。
我认为你没有这样做,因为你似乎不知道它,它可能会导致这些症状。阅读您的库文档并查找。你指的是一个' ftp'对象,查看该库的文档(或源代码),并确定是否没有为文本或二进制文件设置选项的方法。
您还可以使用十六进制编辑器查看源和结果文件中的字节,以查看是否可以看到损坏中的模式 - 字节看起来是否正常,直到它们到达源的位置有一个行尾字符,但实际上它是一个二进制文件?服务器是否剥离了第8位(FTP可以追溯到常用的7位ASCII的日子)。