2012-08-16 85 views
5

下面的代碼片段從某個URL下載文件並將其保存到本地文件。小菜一碟。這裏有什麼可能是錯的?誰篡改我的數據流?

protected long download(ProgressMonitor montitor) throws Exception{ 
    long size = 0; 
    DataInputStream dis = new DataInputStream(is); 
    int read = 0; 
    byte[] chunk = new byte[chunkSize]; 
    while((read = dis.read(chunk)) != -1){ 
     os.write(chunk, 0, read); 
     size += read; 
     if(montitor != null) 
      montitor.worked(read); 
    } 

    chunk = null; 
    dis.close(); 
    os.flush(); 
    os.close(); 
    return size; 
} 

的原因,我在這裏張貼問題,是因爲它在工作的時候99.999%及預期,無論是否存在病毒或安裝在運行此代碼的計算機上的一些其他保護軟件不能正常工作。我盲目地用這種方式指向一個手指,因爲每當我停止(或禁用)它,代碼再次完美。這種干擾的最終結果是下載文件的MD5與預期不符,並且全新的傳奇開始了。

所以,問題是 - 是否真的有可能一些智能的「保護」軟件會改變來自URL的實際流而不知道它呢?如果是的話 - 你如何處理這個問題? (通過Kasperksy和諾頓產品進行驗證)。


編輯-1: 顯然,我已經有了對這個問題保持和它什麼都沒有做與防病毒軟件。下載從FTP服務器(特別是FileZilla)進行,我們在客戶端使用apache commons ftp。我所做的就是去FTP服務器並在下載過程中終止連接(踢出它)。我預計is.read(..)會在客戶端拋出一個IOException,但是這從來沒有發生過。相反,is.read(..)返回-1意味着沒有更多來自流的數據。這絕對是意想不到的,並解釋了爲什但這並不能解釋爲什麼有時數據也會被改變。

+1

定義'barfs'。 – EJP 2012-08-16 10:29:31

+1

你如何處理免除?如果'dis.close()'拋出異常,輸出流將無法正確關閉。 – dacwe 2012-08-16 10:32:48

+0

@dacwe - 不管從這個方法拋出的是失敗,一切都會中止。神祕的是沒有任何東西被拋出,所有東西都被下載得很好。問題是,它不是我所期望的數據,大部分時間它被削減了一半,有時候被改變了。 – Dima 2012-08-16 10:37:29

回答

1

是的,這一直髮生在我身上。在我的情況下,它是由我的公司網絡上的Websense透明HTTP代理引起的。最糟糕的問題是由200 OK返回的塊頁面引起的。

您是否每次都得到相同或相似的損壞?例如,你是否得到了一些解釋爲什麼請求被阻止的HTML?您可以做的最好的方法是將下載的數據的前幾個字節與塊頁面中的某些文本進行比較,並在此情況下引發異常。

編輯:根據您的更新,你有FTP客戶端設置爲圖像/二進制模式?

+0

在我的情況下,這不是一個文本,我會注意到什麼被篡改。我下載了二進制安裝包,所以很難判斷它的哪一部分被爆炸。最終結果是一個損壞的二進制文件,最終用戶完全混淆了它,當它實際上位於他們的網絡上時,它指向我。 – Dima 2012-08-16 10:54:50

+0

您需要將不正確的字節寫入磁盤並查看它們。 – artbristol 2012-08-16 11:18:30

+0

也許這是一個好主意.. – Dima 2012-08-16 11:21:12