我目前正在研究一個將大型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!
問候;
是否有從FTP切換到SCP的機會?請參閱http://www.jcraft.com/jsch/ – 2013-05-03 19:47:06
我的主機服務器不允許TCP傳輸:/ – user2154283 2013-05-03 21:23:52
其他人? ( – user2154283 2013-05-04 12:10:01