Spring MVC:要下载的大文件,OutOfMemoryException

但是对于大文件〜300mb-600mb,这些解决方案将失败。我在最后一行得到OutOfMemoryException:

@RequestMapping(value = "/file/{dummyparam}.pdf", method = RequestMethod.GET, produces=MediaType.APPLICATION_OCTET_STREAM_VALUE)

public @ResponseBody byte[] getFile(@PathVariable("dummyparam") String dummyparam, HttpServletResponse response) {

.

.

InputStream is = new FileInputStream(resultFile);

response.setHeader("Content-Disposition", "attachment; filename=\"dummyname " + dummyparam + ".pdf\"");

.

.

return IOUtils.toByteArray(is);

我的天真假设是IOUtils甚至可以处理大文件,但这显然没有发生。有什么方法可以在下载进行时将文件拆分为多个块?文件通常约为300-600mb。并发下载的最大数量估计为10。

简单的方法是将文件链接为Web服务器目录中的静态内容,但我们希望在Spring应用程序中尝试执行此操作。

回答:

这是因为您正在将整个文件读取到内存中,所以请使用缓冲的读写操作。

@RequestMapping(value = "/file/{dummyparam}.pdf", method = RequestMethod.GET, produces=MediaType.APPLICATION_OCTET_STREAM_VALUE)

public void getFile(@PathVariable("dummyparam") String dummyparam, HttpServletResponse response) {

InputStream is = new FileInputStream(resultFile);

response.setHeader("Content-Disposition", "attachment; filename=\"dummyname " + dummyparam + ".pdf\"");

int read=0;

byte[] bytes = new byte[BYTES_DOWNLOAD];

OutputStream os = response.getOutputStream();

while((read = is.read(bytes))!= -1){

os.write(bytes, 0, read);

}

os.flush();

os.close();

}

以上是 Spring MVC:要下载的大文件,OutOfMemoryException 的全部内容, 来源链接: utcz.com/qa/418680.html

回到顶部