当前位置: 首页 > 知识库问答 >
问题:

Spring:下载大文件引发OutOfMemoryError

从渊
2023-03-14

目前,我正在使用此代码来下载文件

ResponseEntity<Resource> response = this.restTemplate
    .getForEntity(
        uriToCall,
        Resource.class
    );

问题是当我尝试下载大文件时,代码会引发OutOfMemoryError

有没有其他方法可以避免这个错误来获取我的大文件?

编辑:另一个问题。

我正在考虑应用FileSystemResource而不是Resource

ResponseEntity<FileSystemResource> resp = this.restTemplate
    .getForEntity(
        uriToCall,
        FileSystemResource.class
    );

FileSystemResourceResource有什么区别?那个类会实现我的目标吗?

共有2个答案

古文康
2023-03-14

有关类似问题的解答,请参阅以下内容:

如何使用RestTemplate转发大文件?

按如下方式创建 Rest 模板:

RestTemplate restTemplate = new RestTemplate();

SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setBufferRequestBody(false);
restTemplate.setRequestFactory(requestFactory);

这应该可以解决您的内存不足问题。

仇和蔼
2023-03-14

对于大文件,更好的方法是使用流,因此大小仅受可用磁盘空间的限制。类似的东西应该工作:

this.restTemplate.execute(uriToCall, HttpMethod.GET, null, clientHttpResponse -> {
    File file= File.createTempFile("download", "tmp");
    StreamUtils.copy(clientHttpResponse.getBody(), new FileOutputStream(file));
});

请参见暂停和恢复的示例。

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

  • 问题内容: 但是对于大文件〜300mb-600mb,这些解决方案将失败。我在最后一行得到OutOfMemoryException: 我的天真假设是IOUtils甚至可以处理大文件,但这显然没有发生。有什么方法可以在下载进行时将文件拆分为多个块?文件通常约为300-600mb。并发下载的最大数量估计为10。 简单的方法是将文件链接为Web服务器目录中的静态内容,但我们希望在Spring应用程序中尝试

  • 主要内容:文件下载在实际的项目开发中,文件的上传和下载可以说是最常用的功能之一,例如图片的上传与下载、邮件附件的上传和下载等。在《 Spring MVC 文件上传》一节中我们介绍了文件的上传,本节我们将对 Spring MVC 中的文件下载功能进行讲解。 文件下载 文件下载的含义十分简单,它指的就是将服务器中的文件下载到本机上。 下面我们就结合一个实例,来演示下如何在 Spring MVC 中实现文件的下载功能,可

  • 我遇到了一个问题,从带有angular2的Spring boot加载文件。 这是我在spring boot的代码,它来自:使用spring MVC返回生成的pdf。我可以用postman直接下载文件,但不能用angular2... Angular2服务 和下载按钮 当我点击下载按钮chrome打开新标签并立即关闭它不显示任何文件。以下是Postman的一些响应标题。

  • 本文向大家介绍使用Perl引发“文件下载”对话框,包括了使用Perl引发“文件下载”对话框的使用技巧和注意事项,需要的朋友参考一下 有时,您希望提供一个选项,使用户单击链接,该链接将向用户弹出“文件下载”对话框,而不显示实际内容。这非常简单,可以使用Perl Script通过HTTP标头实现。 这个HTTP标头与上一节中提到的标头不同。例如,如果要使FileName 文件可从给定链接下载,则其语法

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