相关疑难解决方法(0)

如何在 Spring RestController 中下载 excel 文件

我正在使用 Apache POI 生成.xlsx文件。

我想从 Spring 控制器返回该文件。这是我到目前为止所做的:

控制器:

@RequestMapping(method = RequestMethod.GET)
    public HttpEntity<byte[]> createExcelWithTaskConfigurations(HttpServletResponse response) throws IOException {
        byte[] excelContent = excelService.createExcel();

        HttpHeaders header = new HttpHeaders();
        header.setContentType(new MediaType("application", "vnd.openxmlformats-officedocument.spreadsheetml.sheet"));
        header.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=my_file.xls");
        header.setContentLength(excelContent.length);

        return new HttpEntity<>(excelContent, header);
    }
Run Code Online (Sandbox Code Playgroud)

是否可以从 rest 控制器返回实际的 excel 文件,以便用户可以将其下载到他的计算机上?至于现在控制器返回 byte[] 但我想返回它的实际文件。我怎样才能做到这一点?

java excel spring

9
推荐指数
1
解决办法
2万
查看次数

如何在 Spring MVC 中处理 IO 流

我有一个返回ResponseEntity(InputStreamResource) 的方法。在此方法中,我根据文件名输入从文件中获取 InputStream,然后将 InputStreamResource 作为响应发送。

代码片段

InputStream inputStream = ...;    
ResponseEntity<InputStreamResource> response = new ResponseEntity<InputStreamResource>(new InputStreamResource(inputStream), headers, HttpStatus.OK);
return response;
Run Code Online (Sandbox Code Playgroud)

这里我需要关闭 inputStream 对象吗?如果我这样做,我会得到

IllegalStateException:已关闭消息。我是否需要明确关闭它们或容器会照顾。

inputstream spring-mvc

8
推荐指数
1
解决办法
2796
查看次数

Spring boot Java堆空间用于下载大文件

我正在尝试编写一个 REST api 来允许用户在 Spring boot 上下载大文件(即 > 2GB)。我遇到了“Java Heap outOfMemoryException”。我尝试对问题进行分类,我发现 HttpServetResponse 对象的类型为:ContentCachingResponseWrapper。此类缓存写入输出流的所有内容,当缓存的数据大小变为 258MB 左右时,我会收到 OutOfMemoryException。为什么是 248 MB,因为 JVM 有 256 MB 堆内存。

ContentCachingResponseWrapper 中默认的flushBuffer()方法是空的。如果我尝试调用 copyBodyToResponse()(用于将数据从缓存复制到流),它工作正常,但它也会关闭流。这导致仅将第一块数据发送到客户端。

有什么建议 ?

public void myDownloader(HttpServletRequest request, HttpServletResponse response) {
             //response.getClass() is: ContentCachingResponseWrapper  
             byte[] buffer = new byte[1048576];  // 1 MB Chunks
             FileInputStream inputStream = new FileInputStream(PATH_TO_SOME_VALID_FILE);
             int bytesRead= 0;
             ServletOutputStream outputStream = response.getOutputStream();

             while ((bytesRead = inputStream.read(buffer)) != -1) {              
                 outputStream.write(buffer, 0, bytesRead);
                 outputStream.flush();
                 response.flushBuffer();
               } 
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Caused by: java.lang.OutOfMemoryError: Java heap space …
Run Code Online (Sandbox Code Playgroud)

java spring-boot

4
推荐指数
1
解决办法
1万
查看次数

标签 统计

java ×2

excel ×1

inputstream ×1

spring ×1

spring-boot ×1

spring-mvc ×1