Http java文件下载问题

时间:2011-06-01 09:24:01

标签: java http url download httpclient

尝试使用apache httpclient库下载文件,并且导致文件小于原始文件(大约32-32kb,正常文件大小为92-93)时出现问题,并且无法在pdf查看器中正常打开。 有人可以解释一下为什么会发生这种情况吗? (使用firefox下载此文件有时会导致文件被完全下载,有时会被部分下载)

以下是我用来通过网址下载文件的代码

    URL url = new URL("pathtofile");
    final URLConnection connection = url.openConnection();

    final InputStream is = connection.getInputStream();
    FileOutputStream fos = new FileOutputStream("C://result1.pdf");

    byte buffer[] = new byte[1024];
    int bytesRead; 
    while ((bytesRead = is.read(buffer)) >= 0) {        
        fos.write(buffer, 0, bytesRead);
    }
    fos.flush();
    fos.close();
    is.close();

P.S。试图使用HttpClient apache库下载此文件,结果相同。

更新:使用网络工具监控流量我发现通过Firefox和应用程序接收文件之间存在差异。

Firefox首先使用HttpPayloadLine:

HTTPPayloadLine: 83 Td /F2 5.80476 Tf (A:\040Asinis\04017.12.10\04008:32\040laboratorij) Tj 100 Tz 1 1 1 rg /F1 5.80476 Tf 0 0 0 rg 104.4856 0 Td <0145> Tj 1 1 1 rg 0 0 0 rg 3.62799 0.72565 Td /F2 5.80476 Tf (\040) Tj 1 1 1 rg 0.83137 0.81569 0.78431 RG ET 51

首先使用应用程序HttpPayload

HTTPPayloadLine: CWgC,ú&ÿ3@Î"ݯV¨®~×>×)\ªleÚlμï½ci ¤Ãðð'È/CÈAø¯ªÍübA«1Ãÿ Åç«VɬZòYóóy7»ÇH.o²e<qZna3l±°¥þ6ñþ[2YÚ1ì³Eë-ÓÊÏ$y:tÎà![ËÅS¤¿É¡¢è,þ|ºs¨)@¢Qâ¯ÝF~}oµÒ>¦ OAxz³äÒ.ß9 æÃZ¤ùÒ¨*«øUή+4×

此测量是通过Microsoft网络监视器

进行的

最后更新毕竟,在修复了成功下载文件之后,服务器出现了问题

4 个答案:

答案 0 :(得分:3)

尝试更改为

while ((bytesRead = in.read(buffer)) != -1) {
 byte[] tmp = ArrayUtils.subarray(buffer, 0, bytesRead);
 fos.write(tmp);
}

你的mite返回0字节,但这并不意味着它已完成。也只写你收到的不是缓冲区的字节。

答案 1 :(得分:0)

我发现的第一件事就是你检查is.read(buffer) > 0是否错误,因为它(理论上至少)可能会返回0,即使它没有到达文件末尾。当达到EOF时,InputStream.read()将返回-1,因此请进行比较>= 0

编辑: 我发现的第二件事(有点晚了,因为它已经在其他答案中被注意到)是你将整个缓冲区写入输出流,无论它有多少实际受到最新读取操作的影响。尝试类似:

byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead;
while ( (bytesRead = in.read(buffer)) >= 0 ) {
    out.write(buffer, 0, bytesRead);
}

答案 2 :(得分:0)

也许阅读错误流可以为您提供一些信息:

connection.getErrorStream();

答案 3 :(得分:0)

您可以使用org.apache.commons.io.FileUtils.copyURLToFile(URL, File)吗?