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 つの異なるリモート マシンにアップロードしています。デバッグ中に、 if(ftp != null) 行で停止し、しばらくしてから ftp.quit() を実行すると、常に成功するという動作が見つかりました。ftp コードを確認しましたが、tar.gz ファイルを ftp する別のスレッドが見つかりませんでした。そのすべてがシリアルに実行されます。私の疑問は、この tar.gz ファイルが破損している理由と、デバッグ中に成功した理由です。

vsftpd サービスは両方のマシンで実行されています。また、ターミナルから手動で ftp を実行しているときに、成功しました。Java のバージョンは 1.6 です。

4

1 に答える 1

1

FTP 設定を確認してください。ほとんどの FTP 実装には、ファイルの種類の設定があります。それがテキストかバイナリか、または実装がそれ自体がどのタイプであるかを判断する必要があるかどうか。


コメントに応えて:

私は FTP プロトコルについて詳しくは知りませんが、FTP クライアントには通常、「テキスト」または「バイナリ」ファイルの設定があり、クライアントがどの種類のファイルを転送するかを確認するオプションがあることは知っています。その中の最初のバイト。これは、クライアントからサーバーに伝達されるものであり、サーバーが行末をサーバーの特定の OS に適した一連のバイトに変換するなどのことを行うことができると思います。

あなたはそれについて知らないようで、これらの症状を引き起こす可能性があるため、設定していないと思います。ライブラリのドキュメントを読んで、これを探してください。「ftp」オブジェクトを参照し、そのライブラリのドキュメント (またはソース) を見て、テキストまたはバイナリのオプションを設定する方法がないかどうかを判断します。

16 進エディタを使用して、ソース ファイルと結果ファイルのバイトを調べて、破損にパターンがあるかどうかを確認することもできます。ソースが終了した場所に到達するまで、バイトは問題ないように見えますか? -of-line 文字ですが、実際にはバイナリ ファイルですか? サーバーは 8 番目のビットを取り除いていますか (FTP は一般的に使用されていた 7 ビット ASCII の時代にさかのぼります)。

于 2013-11-13T13:18:45.397 に答える