2013-07-30 74 views
1

我已經使用java代碼從服務器下載文件,並且在下載文件後,文件從服務器中刪除。文件的總大小是200GB。下載開始並顯示下載成功。當我檢查下載的文件大小隻有3.3 GB。並且該文件也不會被刪除。我檢查了錯誤日誌,但沒有日誌。這是我的代碼。3gb後下載失敗

byte b[] = new byte[2048]; 

int len = 0; 
filein = new BufferedInputStream(new FileInputStream(file)); 
output = new BufferedOutputStream(response.getOutputStream()); 
response.setContentType("application/force-download"); 
response.setHeader("content-Disposition", "attachment; filename=" + fname); // downloaded file name 
response.setHeader("content-Transfer-Encoding", "binary"); 
while ((len = filein.read(b)) > 0) { 
    output.write(b, 0, len); 

    output.flush(); 
} 
output.close(); 
filein.close(); 
file.delete(); // delete file 

請建議我缺少的是什麼..

+0

你一定是在開玩笑。 200千兆字節?我不知道可以讓您每月下載超過150 GB的互聯網服務。 – tbodt

+0

我似乎是一個壞主意,刪除文件,而不檢查下載是否成功。 – Dahaka

+0

@Dahaka根據代碼,文件應該在成功下載後被刪除,但不會被刪除。 – anonymous

回答

1

我想響應開始佔用太多的大小在內存中後您的服務器殺死下載(最終響應)。檢查可用內存是否有問題。 Linux有一個守護進程,如果事情開始變得嚴重,它將簡單地殺死高端內存使用進程。

如果服務器突然結束響應,則可能是客戶端(瀏覽器)仍認爲下載成功。這也可以解釋爲什麼如果文件被拋出異常,文件不會被刪除。

我會在try {...} catch(Throwable t)中包含while循環//捕獲所有異常和錯誤 並查看會發生什麼。

+0

+1你已經說*完全相同的東西,我打算在午休後寫東西:)捕捉Throwable(注意守護進程)和[檢查內存](http://stackoverflow.com/a/25596/1654265);我會添加[檢查文件系統的限制](Solaris)很多不同的方式發生 –