Java 根据客户端请求流式传输大型存档文件的进度?

Java 根据客户端请求流式传输大型存档文件的进度?,java,http,streaming,dropwizard,Java,Http,Streaming,Dropwizard,在我的基于Java/Dropwizard的应用程序中,我有一个端点,允许客户端根据请求下载数据。客户端使用Curl/Wget等工具调用端点。此端点按需构建ZIP存档,并使用ZipoutStream将其流式传输回客户端。在内部,端点知道需要处理多少数据,并且能够相当准确地预测进度。但是,由于使用了ZIP,它显然不能在响应头中设置任何内容长度之类的内容。数据量可能很大,客户端抱怨缺少下载时间估计 curl <endpoint> > foo.zip % Total % Rec

在我的基于Java/Dropwizard的应用程序中,我有一个端点,允许客户端根据请求下载数据。客户端使用Curl/Wget等工具调用端点。此端点按需构建ZIP存档,并使用ZipoutStream将其流式传输回客户端。在内部,端点知道需要处理多少数据,并且能够相当准确地预测进度。但是,由于使用了ZIP,它显然不能在响应头中设置任何内容长度之类的内容。数据量可能很大,客户端抱怨缺少下载时间估计

curl <endpoint> > foo.zip

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                               Dload  Upload   Total   Spent    Left  Speed
100 7466k    0 7466k    0     0  10351      0 --:--:--  0:12:18 --:--:--  8985
curl>foo.zip
%总接收百分比%x平均速度时间电流
数据加载上载总左速度
100 7466k 0 7466k 0 0 10351 0——:::--0:12:18——:::--8985

想知道是否有一种方法可以通过标准的HTTP方法将进度传达给客户机?

在发送归档文件之前,确实应该先压缩归档文件。内容长度头对于任何不使用分块传输编码的HTTP事务来说都是必不可少的……如果您使用的是Java,我猜您没有使用分块传输编码(我承认我可能错了)

无法向客户端更新下载进度。我知道这听起来不令人满意,所以我会解释原因。一旦发送了头并且客户端开始读取HTTP消息体,所有接收到的数据都将被视为消息体。您发送到该客户端套接字的任何内容都无法与压缩存档的字节区分开来。不可能发送任何将被curl或wget解释为元数据的内容

您真正应该发送内容长度的另一个原因是curl和wget不知道消息何时结束(再次假设您没有使用分块传输编码)。即使关闭OutputStream,curl和wget也会继续侦听更多数据,直到超时为止,这可能需要长达15秒的不活动时间


如果您只需事先压缩归档文件并发送内容长度,所有内容都将自行处理。curl和wget将自动监视和显示进度,并在收到所有数据后停止侦听连接。

谢谢您的回复!事先压缩数据肯定会使提供内容长度变得微不足道,但我想当前设计背后的基本原理是使操作对服务器的影响尽可能小。特别是,它不需要执行您的建议所需的大量临时磁盘空间。如果他们只使用
curl/wget
,则不需要。
Content Length
是标准方法。