我开发了一个提供REST的Spring MVC项目。 其中一个方法返回一个zip文件的数据。如果数据包很小(10MB以下)或者我们收到的连接很少,那么响应时间就可以了,但是如果我有一个20MB的文件或一百个请求,那么它很慢。这是我的代码:
IOUtils.copy(is, resp.getOutputStream());
我插入了很多日志和#34; reqid"客户端和服务器共享的参数,用于监控每个请求。
当我有多个并发请求时,命令R
变得非常慢。如果我发送80个请求,则复制20MB文件需要的时间超过一分钟。
我不认为我的代码存在问题。也许这取决于Spring MVC如何管理@RestController bean?或者是访问磁盘的I / O问题?该系统位于AWS EC2虚拟机上。
答案 0 :(得分:2)
您实施的是通过直接写入HttpServletResponse
OutputStream
来下载文件的屏蔽方式。
如果您使用的是Spring 4.2+,则可以返回StreamingResponseBody
,它会将文件字节异步流式传输到接收客户端。
答案 1 :(得分:0)
而不是使用IOUtils.copy(is, resp.getOutputStream());
将文件的输入流复制到HttpServletResponse
的输出流使用 FileSystemResource
来下载客户端的zip文件。< / p>
public FileSystemResource downloadFile(HttpServletResponse response) {
File file = new File("BASE_PATH/MY_ZIP_FILE.zip");
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment; filename="+"MY_ZIP_FILE.zip");
return new FileSystemResource(file);
}