2012-08-16 3 views
5

아래 코드는 일부 URL에서 파일을 다운로드하고 로컬 파일에 저장합니다. 케이크 한 조각. 여기에 무엇이 잘못 될 수 있습니까? 그것은 시간의 99.999 %에서 작동 및 안티 바이러스 또는이 코드를 실행하는 컴퓨터에 설치된 다른 보호 소프트웨어가있을 때마다 예상대로 작동하지 않기 때문에데이터 스트림을 누가 조작합니까?

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; 
} 

이유는 내가 여기에 질문을 게시하고있다. 내가 막을 때마다 코드가 완벽하게 작동하기 때문에 나는 맹목적으로 손가락을 가리키고있다. 이러한 간섭의 최종 결과는 다운로드 한 파일의 MD5가 예상과 일치하지 않으며 완전히 새로운 무용담이 시작된다는 것입니다.

그래서, 어떤 스마트 한 "보호"소프트웨어가 내가 알지 못하는 사이에 URL에서 오는 실제 스트림을 변경하게 될 가능성이 있습니까? 그리고 그렇다면 어떻게해야합니까? (은 Kasperksy 및 Norton 제품과 함께 확인되었습니다.).


편집-1 : 은 분명히 내가 문제에 보류있어 그것은 antiviruses 함께 할 아무것도있다. 다운로드는 FTP 서버 (특히 FileZilla)에서 이루어지며 우리는 클라이언트 측에서 apache commons ftp를 사용합니다. 내가 한 일은 FTP 서버에 가서 다운로드 중간에 연결을 종료했다는 것입니다. 나는 is.read (..)가 클라이언트 측에서 IOException을 던질 것이라고 예상했지만, 이것은 결코 발생하지 않았다. 대신에 is.read (..)는 스트림에서 오는 데이터가 더 이상 없다는 것을 -1을 반환합니다. 이것은 분명히 예기치 않은 일이며 때로는 부분 파일을 가져 오는 이유를 설명합니다. 그러나 때때로 데이터가 변경되는 이유는 설명하지 않습니다.

+1

'barfs'를 정의하십시오. – EJP

+1

exeptions는 어떻게 처리합니까? 'dis.close()'가 예외를 던지면 출력 스트림이 제대로 닫히지 않습니다. – dacwe

+0

@dacwe -이 메소드에서 던져진 것이 모두 실패하면 모든 것이 중단됩니다. 수수께끼는 아무것도 던져지지 않는다는 것입니다. 모든 것이 잘 다운로드됩니다. 문제는 내가 기대하는 데이터가 아니라 대부분이 반으로 줄어들거나 때로는 변경된 것입니다. – Dima

답변

1

네, 이런 일이 항상 저에게 일어납니다. 제 경우에는 회사 네트워크에서 Websense가 투명한 HTTP 프록시를 사용하기 때문에 발생합니다. 최악의 문제는 200 OK로 반환되는 블록 페이지로 인해 발생합니다.

매번 동일하거나 유사한 손상이 발생합니까? 예 : 요청이 차단 된 이유를 설명하는 HTML을 가져 왔습니까? 가장 좋은 방법은 다운로드 한 데이터의 처음 몇 바이트를 블록 페이지의 일부 텍스트와 비교하고이 경우 예외를 throw하는 것입니다.

편집 : 업데이트를 기반으로 FTP 클라이언트를 이미지/바이너리 모드로 설정 했습니까?

+0

필자의 경우 텍스트가 아니기 때문에 정확히 무엇이 변조되었는지 알아 차렸을 것이다. 바이너리 설치 패키지를 다운로드하기 때문에 어떤 부분이 손상되었는지 알기가 어렵습니다. 최종 결과는 손상된 바이너리이며 최종 사용자의 총 혼란으로 네트워크에 실제로있을 때 손가락을 가리킨다. – Dima

+0

잘못된 바이트를 디스크에 기록해야합니다. – artbristol

+0

아마도 좋은 생각입니다. – Dima

관련 문제