从性能的角度来看,使用 Spring Rest API 从服务器读取较大大小的文件



我能够从服务器读取日志文件并能够通过 Spring Rest API 成功下载相同的日志文件,现在我的查询操作系统现在我在服务器上的输入文件大小为 500 MB,但无论如何,如果我的文件达到 1 GB,那么在这种情况下,我需要在下面的代码段中进行哪些修改以提高性能

@GetMapping("/download/{filename}")
public ResponseEntity<Resource> download(@RequestParam String filename) throws IOException {
File file = new File(SERVER_LOCATION + File.separator + filename + EXTENSION);
HttpHeaders header = new HttpHeaders();
header.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + filename + EXTENSION);
header.add("Cache-Control", "no-cache, no-store, must-revalidate");
header.add("Pragma", "no-cache");
header.add("Expires", "0");
Path path = get(file.getAbsolutePath());
ByteArrayResource resource = new ByteArrayResource(Files.readAllBytes(path));
final ResponseEntity<Resource> resourceResponseEntity = ResponseEntity.ok()
.headers(header)
.contentLength(file.length())
.contentType(MediaType.parseMediaType("application/octet-stream"))
.body(resource);
return resourceResponseEntity;
}

您当前的代码正在使用Files.readAllBytes(path)将整个文件读入内存。虽然这可能适用于小文件,但它会中断大文件或大量打开的文件。相反,您应该做的不是阅读它,而是使用例如FileInputStream

File file = new File(SERVER_LOCATION + File.separator + filename + EXTENSION);
Resource resource = new FileSystemResource(file);

Path path = get(file.getAbsolutePath());
Resource resource = new InputStreamResource(Files.newInputStream(path));

这将仅在需要时加载并直接流式传输结果。

相关内容

  • 没有找到相关文章

最新更新