使用线程实现Servlet文件下载

3
我在下载servlet文件时遇到了问题。我从httpResponse.getOutputStream()获取了输出流,并将此输出流对象传递给另一个类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,也成功下载了。


看起来新线程的HTTP响应最终被写入了你的文件。你说:“我将FileOutputStream传递给了线程而不是ServletOutputStream,然后它也成功下载了。”——那么为什么这不是你问题的满意答案呢? - Jeremy Goodell
1个回答

2
您不应该从servlet方法外部传递HTTP响应到当前HTTP请求线程。当servlet方法返回时(而线程仍在后台运行),容器将立即发送响应。
如果将任务委托给其他线程,下载速度不会更快。当前的HTTP请求已经由专用线程处理。我建议您放弃这种方法,只需在当前HTTP请求线程中执行流式传输作业。这可以避免您的应用程序创建不必要的线程,这些线程只会消耗更多资源。
为了提高下载速度,您的servlet最好重新设计以支持Range请求。这样,客户端可以自行通过自动或使用某些特定的浏览器插件发送多个If-Range请求来分段下载文件,然后物理上使用多个HTTP连接(因此服务器端将使用多个HTTP请求/线程)。不过这并不是非常简单的事情。您可以在这篇博客文章中找到一个具体的入门示例。请注意,尽管这种方法理论上可能会提高下载速度,但仍受网络带宽限制。只有当客户端的传入网络带宽比服务器的传出网络带宽更宽,并且服务器(或ISP!)已经配置为按连接限制带宽时,才能更快地下载。这在90年代期间并不罕见,但现在已经不太常见了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接