java - 从服务器响应写入(下载)文件时如何忽略内容长度异常?
问题描述
我正在向我无法控制的服务器发出请求。它返回一个可下载的响应。我在客户端下载文件如下
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 文件)是完美的,只是大小的估计值相差了一小部分。
将此报告给服务器维护人员,但我想知道是否有办法忽略此异常。假设对下载文件的检查是由自己完成的。
解决方案
假设文件是完整的,您可以简单地捕获异常,刷新流的其余部分,关闭它,并且文件应该按照服务器给出的完整写入。当然,如果文件只是部分完整,那么您将无法在任何情况下将文件作为 zip 文件打开,因此请确保文件在发送时是正确的并且这只是一个问题的内容长度。
推荐阅读
- angular - 在 Angular 8 的 Bootstrap 模式对话框中可见组件后如何运行函数?
- java - Hyperledger Fabric - 无法解析主机 - 将资产发布到链码时
- reactjs - 如何在 gh-pages(github 页面)上部署我的 React 应用程序?
- wpf - WPF/MVVM DataGrid - 即使 GridLinesVisibility 为 False,也显示一条水平网格线
- php - 对象数组上的PHP usort函数不起作用
- performance - 带有 v-for 的 Vue 组件渲染和加载第一个字节非常慢
- python - 如何在 python 中使用 pandas 以特定方式从数据框中选择数据
- java - 从 Apache Beam(GCP 数据流)写入 ConfluentCloud
- java - 将 JAXB 与 AutoValue 结合使用时,编组错误“没有无参数默认构造函数”
- laravel - file_exists():open_basedir 限制生效。文件 (/tmp) 不在允许的路径内