Mar*_* V. 6 java spring-mvc download
如何通过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);
Run Code Online (Sandbox Code Playgroud)
我(天真)的假设是IOUtils甚至会处理大文件,但这显然不会发生.有没有什么方法可以在下载过程中将文件拆分成块?文件通常大约300 - 600mb.最大并发下载量估计为10.
简单的方法是将文件链接为webserver目录中的静态内容,但我们想在Spring应用程序中尝试这样做.
Aru*_*hny 18
这是因为您正在将整个文件读入内存,而是使用缓冲读写.
@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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10112 次 |
| 最近记录: |