当前位置: 首页 > 面试题库 >

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

景信瑞
2023-03-14
问题内容

但是对于大文件〜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(); 
}


 类似资料:
  • 本文向大家介绍SpringMVC实现文件下载功能,包括了SpringMVC实现文件下载功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了SpringMVC文件下载的具体代码,供大家参考,具体内容如下 两个案例   1.为登录用户提供下载服务。   2.阻止仅通过输入网址即可获取下载。 文件下载概览   为了将文件发送给浏览器,我们需要在控制器中完成以下操作: 对请求处理方法使用vo

  • 我有一个文件表示为块的列表,目标是下载所有块,加入并保存为一个文件。 它应该适用于大文件 应该是跨浏览器解决方案 null null null null 但我仍然无法实现我的目标与涵盖的需求… 如果有人有经验,最好的解决方案,我恳请分享它在这里。谢谢

  • 我正在尝试通过OKHTTP3下载zip文件(大小为160 Mb)。几秒钟后,应用程序与堆栈崩溃: IllegalStateException:在scheduler.worker线程上引发的致命异常。在java.util.concurrent.executors$runnableadapter.call(executors.java:59)在java.util.concurrent.futureta

  • 我正在使用一个插件从一个表生成一个csv文件,该文件是用“下载”文件名下载的,我如何更改文件名,例如作为dowload。csv

  • 问题内容: 我需要使用curl下载远程文件。 这是我的示例代码: 但是它不能处理大文件,因为它首先读取内存。 是否可以将文件直接流式传输到磁盘? 问题答案:

  • 我们有一个运行在Linux上的Weblogic服务器,有多个受管服务器。我所关心的托管服务器的最大堆大小为1024MB。该服务器上部署了多个应用程序。其中一个应用程序处理来自REST api的响应来下载250MB的文件。对于大于50 MB的文件,有时没有问题,但有时服务器会因OOM错误而崩溃。以下是我的代码: 由于存在内存问题,我尝试采用InpuStream方法。以下是更改后的代码: 此代码没有进