1

我正在尝试从我的 Java 应用程序下载文件。但是因为 UrlConnection 使用 HTTP 1.1 协议,我得到了一个传输编码:分块响应,在这种情况下我无法找到文件大小(未设置内容长度)。从我可以找到的 HTTP 版本在类中是硬编码的,没有办法改变它。是否有可能将版本更改回一个或告诉服务器在发送文件时不要使用分块编码?

编辑:我不想检索动态内容,我的应用程序是下载管理器。我下载的文件是静态的。我检查过 wget、igetter、curl 的其他下载器使用 Http 1.0,它们从大多数服务器获取大小信息。但是我的应用程序和发布 Http 1.1 的 firefox 总是得到分块编码。我知道内容长度并不总是存在,但我大部分时间都想得到它。

4

2 回答 2

3

Jakarta Commons HTTP 客户端包含一个“偏好架构”,允许对 HTTP 连接的细节进行一些细粒度的控制。见http://hc.apache.org/httpclient-3.x/preference-api.html

于 2009-04-05T19:07:13.797 回答
3

即使您指定了 HTTP/1.0,服务器也很可能无法指定有效的内容长度。当动态生成内容时,服务器必须将其全部缓冲以测量其总长度。并非所有服务器都能够回退到这种效率较低的行为。

如果缓冲响应是合理的,为什么不在您可以完全控制的客户端中进行呢?这比依赖服务器更安全。

无需处理即可读取响应,只需将数据填充到ByteArrayOutputStream. 完成后,测量生成的字节数组的长度。然后用它创建一个ByteArrayInputStream并处理该流来代替您从URLConnection.

于 2009-04-05T19:11:33.067 回答