java - 在html请求中,无法下载大文件

  显示原文与译文双语对照的内容

我的问题是,我无法下载大于 100mb的文件,而且我怀疑html请求

这是我的回应中的setHeader


HttpServletResponse response = (HttpServletResponse) requestContext.getExternalContext().getNativeResponse();
 response.setContentType("application/octet-stream"); 
 response.setHeader("Content-Disposition","attachment; filename=""+fileName+""");
 response.setHeader("Pragma","public");
 response.setHeader("Cache-control","private");

这是读取文件的流声明


ServletOutputStream sos = response.getOutputStream(); 
 sos.flush();
 BufferedReader br = new BufferedReader(new InputStreamReader(is));
 String str = br.readLine();
 while (str!= null) { 
 sos.write(str.getBytes());
 sos.write(13);
 sos.write(10);
 str = br.readLine();
 }

这个'同时'适用于小文件,但是如果大文件丢失,看起来会因为我错过调试而失败。 是否有办法防止执行错过

时间: 作者:

每次读取数据后,在循环循环中刷新输出流对象。 你可以设置长整型值并检查。 如果这个限制达到了输出流对象中的数据,那么系统将刷新数量的数据并释放内存错误。


ServletOutputStream sos = response.getOutputStream();
 long byteRead = 0;
 try {
 byte[] buf = new byte[8291];
 while (true) {
 int r = is.read(buf);
 if (r == -1)
 break;
 sos.write(buf, 0, r);
 byteRead +=r;
 if(byteRead> 1024*1024){//flushes after 1mb
 byteRead = 0;
 sos.flush();
 }

 }
 } finally {
 if(sos!= null){
 sos.flush();
 }
 try{is.close();}catch(Exception e){}
 try{sos.close();}catch(Exception e){}
 }

最有可以能的问题是,图像的字节数据不会有换行符,而且尝试读取行时内存不足。 你需要创建一个固定大小的缓冲区,并直接复制字节。 像这样:


ServletOutputStream sos = response.getOutputStream();
sos.flush();
try {
 byte[] buf = new byte[1000];
 while (true) {
 int r = is.read(buf);
 if (r == -1)
 break;
 sos.write(buf, 0, r);
 }
} finally {
 try{is.close();}catch(Exception e){}
 try{sos.close();}catch(Exception e){}
}

...