簡體   English   中英

Spring MVC:用於下載的大文件,OutOfMemoryException

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM