2008-10-27 6 views
3

java에서 HttpsURLConnection이 포함 된 원격 서버에서 xml.gz 파일을 다운로드하려고하는데 빈 응답이 표시됩니다. 다음은 내 코드의 샘플입니다.HttpsURLConnection을 사용하여 xml.gz 파일 다운로드

URL server = new URL("https://www.myurl.com/path/sample_file.xml.gz"); 
HttpsURLConnection connection = (HttpsURLConnection)server.openConnection(); 
connection.connect(); 

연결에서 InputStream을 가져 오려고하면 비어 있습니다. (만약 connect.getInputStream()을 시도하면 read()가 나옵니다.) 내가 기대하는 파일은 약 50MB입니다.

내 정신 테스트를 위해 브라우저에 정확히 동일한 URL을 입력하려고했지만 필요한 파일을 반환했습니다. 내가 놓친 게 있니? 연결에서 매개 변수를 설정해야합니까? 어떤 도움/방향을 많이 주시면 감사하겠습니다.

답변

2

예외가 기록되지 않았습니까? 웹 사이트에서 자체 서명 된 SSL 인증서 또는 CA에서 서명하지 않은 인증서를 제공합니까? 브라우저에서 제대로 작동하는 몇 가지 이유가 있습니다 (브라우저가 자체 도메인이 아닌 자체 서명 된 인증서를 수락하도록 지시되었을 수 있음). 또는 wget을 사용하여 URL을 가져온 결과는 어떻게됩니까?

InputStream.read() == -1에서 InputStream이 비어 있음/결과는 스트림에 읽을 내용이 없음을 의미합니다. 즉, 스트림을 올바르게 설정할 수 없음을 의미합니다.

: 연결 코드에서 유효하지 않은/자체 서명 된 인증서를 처리하는 방법에 대한 정보는 일부 정보를 참조하십시오. 또는 사이트가 인증서를 제시하고 있지만 유효하지 않은 경우 서버의 키 저장소로 가져 와서 Java에 인증서를 신뢰할 수 있음을 알릴 수 있습니다. See this page for more info.

+0

제 3자는 원래 곱슬 곱슬 사용하는 나에게 말했다 : 컬 --location -C - --digest -k https://www.myurl.com/path/sample_file.xml .gz -o sample_file.xml.gz 잘 작동합니다. –

+0

curl이있는 -k 스위치는 "인증서가없는 SSL 사이트에 대한 연결 허용"을 의미하므로 사이트가 유효한 인증서를 제공하지 않는다고 가정하는 것이 안전하다고 생각합니다. 이 –

+0

을 설명하기 위해 코드를 업데이트해야합니다. curl 명령은 -k 스위치없이 작동합니다. 나는 그것이 인증서가 유효하다는 것을 의미하는 것을 짐작하고있다. –

2
  1. response codeconnection.contentType 콘텐츠 형식이 인식 확인하기 위해 200
  2. 확인하는 것이인지 확인
  3. 당신은 내가 떨어져 기억하지 수 GZ 마임 유형의 콘텐츠 처리기를 추가해야 할 수 있습니다
  4. 내 머리 꼭대기. 접수대로 응답 코드를 설명하는 주석 후

,

  1. 설정 'connection.setFollowRedirects (사실)'

그것을 수정해야합니다.

+0

응답 코드는 302이며 "요청 된 데이터는 실제로 다른 URL에 있습니다"를 의미합니다. 나는 이것이 내 문제인지 궁금해 ... 나는 이것이 파일을 다운로드하기 위해 컬을 사용할 때 "-location"매개 변수를 사용하라고 공급자에게 제안한 이유라고 생각한다. 이 주위에 어떤 방법이 있습니까? –

+0

'connection.setFollowRedirects (true)'가이를 수행해야합니다. –

+0

followRedirects 속성은 기본적으로 true로 설정되어 있으며 리디렉션 된 URL을 볼 수있었습니다. 그러나 원래 응답에서 connection.getContentType()을 수행하면 null이 반환된다는 사실을 알게되었습니다. 이것은 mime 유형 "application/x-gzip"을 위해 ContentHandler [Factory]를 생성해야한다는 것을 의미합니까? –

1

원격 서버가 파일을 다운로드 할 새 URL로 리디렉션했기 때문에 다운로드가 작동하지 않음을 나타냅니다. (참) connection.setFollowRedirects가 설정에도 불구하고, 난 여전히 다음과 같이 수동 리디렉션 URL에 대한 새로운 연결을 설정했다 : 그 후

if (connection.getResponseCode() == 302 && connection.getHeaderField("location") != null){ 
      URL server2 = new URL(connection.getHeaderField("location")); 
      HttpURLConnection connection2 = (HttpURLConnection)server2.openConnection(); 
      connection2.connect(); 
      InputStream in = connection2.getInputStream(); 
} 

, 내가 입력 스트림에서 파일을 검색 할 수 있었다. 모든 도움을 주셔서 감사합니다! 다음과 같이 파일을 공급하고

+0

나는 이것도 알아 차렸다 : http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6810084 –

관련 문제