我的问题是,我无法下载大于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();
}
这个'while'适用于小文件但是在大文件的情况下,似乎会话丢失了,因为我错过了调试并且没有停在下一个断点。 有没有办法阻止执行错过
答案 0 :(得分:1)
每次读取一些数据后,都会在while循环中刷新输出流对象。你可以设置一个长值并检查。如果达到该限制,则可以刷新输出流对象中的数据,以便系统刷新大量数据并释放为其分配的内存,这样就不会出现内存不足错误。
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){}
}
答案 1 :(得分:0)
最有可能的问题是图像的字节数据不会有换行符,并且您在尝试读取一行时内存不足。您需要创建固定大小的缓冲区并直接复制字节。像这样:
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){}
}