2014-03-01 1 views
0

보안 HTTP 서버에서 JAR 파일을 다운로드하려고합니다. 오류없이 파일을 다운로드 할 수 있지만 jar 파일을 실행하려고하면 Windows가 올바르지 않거나 손상된 파일을보고합니다. 오류가 없기 때문에 어디서 문제가 발생하는지 알 수 없으므로 HTTPS 서버라고 가정합니다. 파일이 3.8MB가되어야하기 때문에 누락 된 데이터가 있다는 것을 알고 있지만 다운로드를 마치면 27KB 밖에 없습니다.Java HTTPS 파일을 다운로드 하시겠습니까?

다운로드 방법은 다음과 같습니다

편집 : 루프를 가진 새로운 코드가 삽입하지만 여전히 나에게 27킬로바이트 파일을 제공합니다.

public static boolean downloadFile(String fileLocation, String urlLocation) { 
    try { 
     System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol"); 
     Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); 
     int i; 
     URL url = new URL(urlLocation); 
     URLConnection conn= url.openConnection(); 
     File f = new File(fileLocation); 
     BufferedInputStream bis = new BufferedInputStream(conn.getInputStream()); 
     BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(f.getName())); 
     while ((i = bis.read()) != -1) { 
      bos.write(i); 
     } 
     bos.flush(); 
     bos.close(); 
     return true; 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return false; 
} 
+0

2003 년 이래로 JSSE 용 'java.net.protocol.handler.pkgs'를 설정하거나 공급자를 추가 할 필요가 없습니다. 이동시 여러분은 어딘가에 HTTP 캐싱에 반대한다고 생각합니다. – EJP

+0

감사하지만 여전히 내 문제를 해결하지 않습니다. 나는 문제가 while 루프에 있다고 말할 수있다. 그러나 아무리 많은 문제가 있더라도 문제는 없다. 나는 지금 오라클 오피스 페이지를 무수히 확인했지만 여전히 도움이되지 못한다. – EternalCode0

+0

그래서 내가 코드 어딘가에 문제가있는 것이 아니라 어딘가에서 HTTP 캐싱에 반대한다고 생각하는 것입니다. – EJP

답변

0

FileChannel.transferFrom를위한 JavaDoc이 말한다 :

"시도는 소스 채널로부터 바이트를 계산하고 지정된 위치에서 시작하는이 채널의 파일에 기록하도록 읽으려고한다이의 호출. 메소드는, 요구 된 바이트의 모두를 전송할지 어떨지, 채널의 성질과 상태에 의존할지 어떨지는 불문하고, 소스 채널의 바이트 수가 나머지의 바이트보다 적은 경우는 요구 된 바이트 수가 전송됩니다. 소스 채널이 넌 블로킹 (non-blocking) 상태이며 입력 버퍼에서 즉시 사용할 수있는 count 바이트보다 작은 수를 가졌을 경우 "

이 경우

는 소스 채널 비 차단 채널이며, 따라서 transferFrom 방법은 한번에 전체 콘텐츠 전송이 보장되지 않는다.

@EJP에 따르면 transferFrom 호출을 루프 등으로 넣어야합니다.

하지만 byte[] ...을 루프로 읽고 쓰는 것이 더 편할 것입니다. InputStreamOutputStream API를 직접 읽고 쓰는 것이 좋습니다.

0

루프에서 transferFrom()을 호출해야합니다. 전체 전송을 수행한다고 보장 할 수는 없습니다. 반환 값은 전송 한 바이트 수를 알려줍니다.

는 는