Spring MVC:用于下载的大文件,OutOfMemoryException

如何通过spring控制器提供大文件下载? 我对类似主题的讨论很少:

从弹簧控制器下载文件

但这些解决方案对于大文件~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。

简单的方法是将文件链接为webserver目录中的静态内容,但我们想在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(); }