我目前正在开发一个将大型 PDF 上传到服务器的应用程序。该应用程序运行良好,但有时,由于 PDF 文件太大(25MB),上传需要一段时间,通常在 30 或 40 分钟后,我会收到“socketException:损坏的管道”。我相信这是由于超时或与服务器断开连接(我猜是服务器切断了连接),所以我将上传例程移动到一个有 try/catch 的循环中。当抛出异常时,我尝试重新连接。它工作正常。上传从它停止的地方开始并完成。
问题?好吧,由于上传被分成两部分(如果发生任何连接丢失或更多部分),上传的文件也被破坏了!我的意思是这很正常,我不明白为什么会发生这种情况,但我想知道的是如何在尝试重新连接时保持上传“暂停”。即使有重新连接,我也只想能够完成上传。我希望我的 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
我知道我的代码并不完美,但没关系,我不是完美主义者 :)
任何帮助将不胜感激!
问候;