首页 > 解决方案 > 从服务器响应写入(下载)文件时如何忽略内容长度异常?

问题描述

我正在向我无法控制的服务器发出请求。它返回一个可下载的响应。我在客户端下载文件如下

File backupFile = new File("Download.zip");

CloseableHttpResponse response = ...;

try(InputStream inputStream = response.getEntity().getContent()) {
    try(FileOutputStream fos = new FileOutputStream(backupFile)) {
        int inByte;
        while((inByte = inputStream.read()) != -1) {
            fos.write(inByte);
        }
    }
}

我收到以下异常:

Premature end of Content-Length delimited message body (expected: 548846; received: 536338
    at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:142)
    at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:120)

Content-Length 分隔的消息正文过早结束(预期:

我经历了上述SO 问题,但该问题及其答案解决了一个严重的错误,即服务器没有提供它所承诺的内容。此外,在下载文件完成之前,我不会关闭客户端。

就我而言,文件(zip 文件)是完美的,只是大小的估计值相差了一小部分。

将此报告给服务器维护人员,但我想知道是否有办法忽略此异常。假设对下载文件的检查是由自己完成的。

标签: javaapachehttpresponsecontent-length

解决方案


假设文件是​​完整的,您可以简单地捕获异常,刷新流的其余部分,关闭它,并且文件应该按照服务器给出的完整写入。当然,如果文件只是部分完整,那么您将无法在任何情况下将文件作为 zip 文件打开,因此请确保文件在发送时是正确的并且这只是一个问题的内容长度。


推荐阅读