[英]Spring MVC : large files for download, OutOfMemoryException
如何通過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。
簡單的方法是將文件鏈接為webserver目錄中的靜態內容,但我們想在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.