2010-08-05 3 views
9

일부 서버에서 일부 파일을 다운로드하는 프로그램을 작성했습니다.
현재 프로그램이 올바르게 작동합니다.
하지만 이력서 지원을 추가하고 싶습니다.
나는 이런 식으로하고 있어요 그러나 결과 파일이 손상 :Java : resume URLConnection에서 다운로드

.... 

File fcheck=new File(SaveDir+"/"+filename); 
if(resumebox.isSelected() && fcheck.exists()){ 
    connection.setRequestProperty("Range", "Bytes="+(fcheck.length())+"-"); 
} 

connection.setDoInput(true); 
connection.setDoOutput(true); 

BufferedInputStream in = new BufferedInputStream (connection.getInputStream()); 

pbar.setIndeterminate(false); 
pbar.setStringPainted(true); 

java.io.FileOutputStream fos ; 
if(resumebox.isSelected()){ 
    if(fcheck.exists()){ 
     if(connection.getHeaderField("Accept-Ranges").equals("bytes")){ 
      fos = new java.io.FileOutputStream(SaveDir+"/"+filename,true); 
     }else{ 
      fos = new java.io.FileOutputStream(SaveDir+"/"+filename); 
     } 
    }else{ 
     fos = new java.io.FileOutputStream(SaveDir+"/"+filename); 
    } 
}else{ 
    fos = new java.io.FileOutputStream(SaveDir+"/"+filename); 
} 

.... 

은 내가 지원을 재개 알고있는 서버에서 테스트하고 있습니다.
몇 바이트를 다운로드했습니다. (72720)
그런 다음 다시 시도했습니다.
그런 다음 16 진수 편집기로 파일을 열었습니다. 오프셋 72720에서 첫 번째 바이트가 반복됩니다.
바이트 0-36 : FLV .............«........ ..onMetaData
바이트 72720-72756 : FLV .............«.......... onMetaData
시작부터 다운로드를 시작합니다!
내가 wget으로 할 때 올바르게 수행하고 Content-Range 필드로 응답합니다!
wget 로그에 "302 FOUND"및 "206 Partial Content"가 포함 된 서버 응답.
"302 FOUND"가 문제를 일으킬 수 있습니까?

무엇이 문제입니까?
감사합니다.

+0

다른 문제는 불필요하게 깊숙이 중첩 된 if/else 블록을 가졌다는 것입니다. '&&'연산자를 사용하십시오. 나는. 'if (a && b && c) {fos = 새로운 FOS (name, true); } else {fos = 새로운 FOS (이름); }'. 그게 전부 야. 마른. – BalusC

+0

코드를 요약했습니다! 블럭이있는 경우에는 일부 메시지를 올리므로 그대로 있어야합니다. 그러나 당신의 응답을 당신을 감사하십시오. – RYN

+0

HTTPUrlConnection은 기본적으로 리디렉션을 따르므로 302는 문제가되지 않습니다. 명시 적으로 리디렉션을 해제하지 않는 한 실제로 파일 내용을 가져 오는 중이므로 의심 스럽습니다. –

답변

17

시도 :

connection.setRequestProperty("Range", "bytes=" + fcheck.length() + "-"); 

소문자 사양에 따라 범위 지정자. 또한 부분 파일이 500 바이트 인 경우 사용자의 바이트 범위가 0-499이고 500+를 원한다는 의미입니다.

+0

감사합니다. 당신 말이 맞아요. 하지만 또 다른 문제가 있습니다, 나는 원래의 게시물을 편집하고 문제를 추가했습니다. 그걸 확인해보십시오. thanks – RYN

+0

요청 헤더가 올바르게 설정되었는지 확인하려면 wireshark와 같은 것을 사용해보십시오. 당신은 setRequestProperty 대신에 addRequestProperty를 사용해 볼 수있다.하지만 둘 다 똑같은 일을하기를 바란다. –

+0

안녕하세요, wireshark를 사용하여 촬영했습니다. 설정됩니다 : "Range : bytes = 257177-"! 하지만 바이트 0에서 다시 시작됩니다! – RYN

3

문제의 범위는 (fcheck.length() - 1)입니다. fcheck.length()이어야합니다.