2013-05-03 135 views
2

我目前正在研究一個將大型PDF上傳到服務器的應用程序。該應用程序工作正常,但有時,由於PDF是如此之大(25MB),上傳需要一段時間,通常在30或40分鐘後,我得到一個「socketException:斷開的管道」。我相信這是由於服務器超時或斷開連接(服務器會切斷我想的連接),所以我將上傳例程移入一個try/catch循環中。當拋出異常時,我嘗試重新連接。它工作正常。上傳從停止並完成的地方開始。Java FTPCLient:上傳文件,連接丟失後重新連接?

問題?那麼,由於上傳是「分解」的兩部分(或更多,如果有任何連接丟失發生),上傳的文件也被打破了!我的意思是說這是正常的,我會告訴你爲什麼會發生這種情況,但我想知道的是,如何在嘗試重新連接時保持上載「保持」。即使有重新連接,我也希望能夠完成上傳。我希望我的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 

我知道,我的代碼是不完美的,不過沒關係,我不是一個完美主義者:)

任何幫助將大大apreciated!

問候;

+0

是否有從FTP切換到SCP的機會?請參閱http://www.jcraft.com/jsch/ – 2013-05-03 19:47:06

+0

我的主機服務器不允許TCP傳輸:/ – user2154283 2013-05-03 21:23:52

+0

其他人? ( – user2154283 2013-05-04 12:10:01

回答

1

我發現了一種替代方法,使用FP4J llibrary for FTP Uoloads和Java,支持重新連接/追加到文件。

相關問題