Spring MVC的:下载大文件,OutOfMemoryException异常(Spring MV

2019-08-19 08:11发布

如何通过弹簧控制器提供下载大文件? 我跟着类似的话题讨论几个:

下载从弹簧控制器文件

但这些解决方案未能对大文件〜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服务器目录中的静态内容链接,但我们想尝试一下我们的春天应用程序内做进去。

Answer 1:

这是因为你正在阅读的整个文件到内存中,使用缓冲读取和写入代替。

@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 : large files for download, OutOfMemoryException