0

我正在使用 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 。

4

1 回答 1

1

检查您的 FTP 设置——大多数 FTP 实现都有文件类型的设置;如果它是文本,二进制,或者实现是否应该自行确定它是什么类型。


回应评论:

我不太熟悉 FTP 协议,但我知道 FTP 客户端通常具有“文本”或“二进制”文件的设置,并且客户端可以通过查看来确定正在传输的文件类型其中的第一个字节。我希望这是客户端与服务器通信的东西,以便服务器可以执行诸如将行尾转换为一组对服务器特定操作系统正确的字节之类的事情。

我猜你没有设置它,因为你似乎不知道它,它可能会导致这些症状。阅读您的图书馆文档并寻找它。您引用“ftp”对象,查看该库的文档(或源代码)并确定是否无法设置文本或二进制选项。

您还可以使用十六进制编辑器查看源中的字节和结果文件,以查看是否可以看到损坏中的模式——字节是否正常,直到它们到达源结束的地方-of-line 字符,但实际上它是一个二进制文件?服务器是否剥离了第 8 位(毕竟,FTP 可以追溯到常用的 7 位 ASCII 的时代)。

于 2013-11-13T13:18:45.397 回答