如何通过spring控制器提供大文件下载?我关注了一些类似主题的讨论:
但是这些解决方案对于大文件 ~ 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();
}
对于Spring,需要使用ResponseEntity中的InputStreamResource类。
演示代码:
MediaType mediaType = MediaTypeUtils.getMediaTypeForFileName(this.servletContext, fileName);
System.out.println("fileName: " + fileName);
System.out.println("mediaType: " + mediaType);
File file = new File(DIRECTORY + "/" + fileName);
InputStreamResource resource = new InputStreamResource(new FileInputStream(file));
return ResponseEntity.ok()
// Content-Disposition
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + file.getName())
// Content-Type
.contentType(mediaType)
// Contet-Length
.contentLength(file.length()) //
.body(resource);
}
参考链接:https://o7planning.org/en/11765/spring-boot-file-download-example
您还可以使用 Spring WebFlux 的响应式编程功能来下载大文件。
是的,可以在 Spring MVC 控制器中使用Spring WebFlux 反应式 Web 客户端。
查看我对类似问题的回答。