2

私は現在、大きなPDFをサーバーにアップロードするアプリに取り組んでいます。アプリは正常に動作しますが、PDF が非常に大きい (25MB) ため、アップロードに時間がかかる場合があり、通常は 30 分または 40 分後に、「socketException : 壊れたパイプ」が発生します。これは、タイムアウトまたはサーバーからの切断が原因であると考えられます (サーバーが接続を切断したと思われます)。そのため、トライ/キャッチのあるループ内でアップロード ルーチンを移動します。例外がスローされると、再接続を試みます。それは正常に動作します。停止したところからアップロードが開始され、完了します。

問題?アップロードが 2 つの部分 (または、接続が失われた場合はそれ以上) で「壊れている」ため、アップロードされたファイルも壊れています。それは間違いなく正常なことであり、なぜそれが起こるのかわかりませんが、再接続しようとしている間、アップロードを「保留」にしておく方法を知りたいです. 再接続があっても完全にアップロードできるようにしたいだけです。PDF を完全にアップロードしたい。これが私が持っているコードです:

// In
inputStream = new FileInputStream(localFile); 

// For upload loop
byte[] bytesIn = new byte[4096];
int read = 0;

// Loop until job is not completed (will try to reconnect if any exception is thrown)
boolean completed = false;
while (!completed){
try{

    // Out
    OutputStream outputStream = ftpClient.storeFileStream(remoteFile);

    // Transfer                 
    while ((read = inputStream.read(bytesIn)) != -1) {
        outputStream.write(bytesIn, 0, read);
        transfered += read;
    }

    // Closing streams
    inputStream.close();
    outputStream.close();

    // Final information
    completed = ftpClient.completePendingCommand();
    if (completed) System.out.println("Done");
    else System.out.println("Failure.");
    completed = true;

} // end try 
catch (Exception e) {

    // Telling the user
    System.out.println("Trying to reconnect...");
    Thread.sleep(1000);

    // Try to reconnect
    ftpClient.connect(server, port);
    success = ftpClient.login(user, pass);
    if (success) {
        System.out.println("Connection : OK");
        Thread.sleep(1000);
    } else {
        System.out.println("Failed to connect");
    }

    // Set passive mode and file type to binary
    ftpClient.enterLocalPassiveMode();
    ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

} // end catch
} // end loop

私のコードが完璧ではないことはわかっていますが、私は完璧主義者ではありません:)

どんな助けでも大歓迎です!

よろしく;

4

1 に答える 1

1

再接続/ファイルへの追加をサポートする Java を使用した FTP Uoloads の FP4J ライブラリを使用する代替方法を見つけました。

于 2013-09-16T10:44:49.980 に答える