2016-02-05 155 views
1

我试图使用从互联网上下载的zip文件下面的代码:为什么我的HTTPS文件下载损坏.zip文件?

public void getFile(String updateURL) throws Exception { 

    URL url = new URL(updateURL); 
    HttpURLConnection httpsConn = (HttpURLConnection) url.openConnection(); 
    httpsConn.setRequestMethod("GET"); 

    TrustModifier.relaxHostChecking(httpsConn); 

    int responseCode = httpsConn.getResponseCode(); 

    if (responseCode == HttpsURLConnection.HTTP_OK) { 

     String fileName = "fileFromNet"; 

     try (FileOutputStream outputStream = new FileOutputStream(fileName)) { 
      ReadableByteChannel rbc = Channels.newChannel(httpsConn.getInputStream()); 
      outputStream.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); 
     }  

    } 
    httpsConn.disconnect(); 
} 

TrustModifier是用来解决“信任问题”一类:http://www.obsidianscheduler.com/blog/ignoring-self-signed-certificates-in-java/

上面的代码可以很好地用于提供zip文件通过普通的http或通过https公开的非压缩文件,但如果我尝试下载通过https端点公开的zip文件,只会下载原始文件的一小段。我已经测试了不同的互联网下载链接,总是得到相同的结果。

有没有人知道我在这里做错了什么?

谢谢。

回答

0

transferFrom()必须在循环中调用,直到传输完成,在这种情况下,您可以知道的唯一方法是将transferFrom()的返回值相加,直到它们等于HTTP响应的内容长度。

+0

谢谢你的回答。正如我所提到的,我的代码适用于所有情况,除非我尝试通过HTTPS下载ZIP文件。好吧,话虽如此,我不明白如何没有这个循环可能会导致zip文件的问题(通过https),而不是让我们说纯文本? – AleksB

+1

你很幸运。只要你阅读简短的内容,它就会失败,这显然更有可能使用TLS。看到Javadoc。没有义务转移整个请求金额。 – EJP

-2

实际上问题出在我用来关闭服务器证书检查的TrustModifier类中。一旦我删除它,因为我不再需要它(我从服务器拿到证书并将其放入本地信任存储库),我的问题就解决了。

+1

这会阻止你完全获得连接。这不会导致这个问题。 – EJP

+0

嗯,我没有解释,但确实是这个问题... – AleksB