Java Can';请不要下载html格式的大文件
我的问题是,我无法下载大于100mb的文件,我怀疑是html请求 这是我的回复中的setHeaderJava Can';请不要下载html格式的大文件,java,web-services,servlets,filestream,session-timeout,Java,Web Services,Servlets,Filestream,Session Timeout,我的问题是,我无法下载大于100mb的文件,我怀疑是html请求 这是我的回复中的setHeader HttpServletResponse response = (HttpServletResponse) requestContext.getExternalContext().getNativeResponse(); response.setContentType("application/octet-stream"); resp
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”可以很好地用于小文件,但是对于大文件,似乎会话丢失了,因为我错过了调试,并且没有在下一个断点停止。
是否有任何方法可以防止执行失败最有可能的问题是图像的字节数据没有换行符,并且尝试读取一行时内存不足。您需要创建一个固定大小的缓冲区并直接复制字节。大概是这样的:
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){}
}
每次读取一些数据后刷新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){}
}
你有例外吗?如果是这样,请发布堆栈跟踪。我无法发布异常,因为服务器中没有发生异常。连接在“while”中丢失。我在我的websphere 1TISIGINFO转储事件“systhrow”(00040000)中发现此日志。收到的详细信息“java/lang/OutOfMemoryError”需要更多内存。THX是的,但是如果你使用上面的代码,你将不需要更多的内存,因为你不会将图像加载到内存中;您将以1kb的数据块向客户端读取数据。我们需要在读取特定字节后刷新ServletOutputStream中的数据。可能代码可以处理小文件,但在处理大文件时出错的可能性是存在的。请添加一个“sos.flush();”在读取每10kB的数据后。尝试使用2GB文件。您可以看到,如果没有实现flush()方法,代码将失败。再次尝试在实现flush()时执行相同的操作。