我正在使用 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[] 但我想返回它的实际文件。我怎样才能做到这一点?
我有一个返回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:已关闭消息。我是否需要明确关闭它们或容器会照顾。
我正在尝试编写一个 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)