3

我在下载 servlet 下载文件时遇到问题。

我从 httpResponse.getOutputStream() 获得了输出流,
并将这个输出流对象传递给另一个类 - FileOperations。
此 FileOperations 作为新线程调用。当我将文件写入输出流并刷新它时,会弹出文件以正确保存它,
但是在保存和打开文件时,我看到第一行如下:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Transfer-Encoding: chunked
Date: Mon, 11 Jun 2012 14:19:37 GMT
2000

在此之后写入文件内容并在几行之后再次写入“2000”,同样如此。

请让我知道如何以线程模式运行下载。

我尝试在不调用线程的情况下下载文件,并且它已正确下载。
我将 FileOutputStream 而不是 ServletOutputStream 传递给线程,它也正确下载。

4

1 回答 1

2

您不应该通过 servlet 方法在当前 HTTP 请求线程之外传递 HTTP 响应。当 servlet 方法返回时(线程仍在后台运行),容器将立即发送响应。

如果您委托给其他线程,下载将不会更快。当前的 HTTP 请求已由专用线程处理。我建议忘记这种方法,只在当前 HTTP 请求线程中执行流式传输作业。这使您的应用程序免于创建不必要的线程,而这只会花费更多资源。

为了提高下载速度,可以更好地重新设计您的 servlet 以支持Range请求。这样,客户端可以自动或使用某些特定的浏览器插件发送多个If-Range请求以分段下载文件,然后物理上使用多个 HTTP 连接(因此服务器端有多个 HTTP 请求/线程)。然而,这一切都不是微不足道的。您可以在此博客文章中找到此类 servlet 的具体启动示例. 请注意,虽然这种方法理论上可能会提高下载速度,但您仍然受到网络带宽限制的限制。只有当客户端的传入网络带宽比服务器的传出带宽更宽并且服务器(或 ISP!)被配置为在每个连接的基础上限制带宽时,它才会更快。这在 90 年代并不少见,但现在并不常见。

于 2012-06-11T15:59:58.463 回答