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

时间:2014-01-15 08:34:21

标签: java web-services servlets filestream session-timeout

我的问题是,我无法下载大于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'适用于小文件但是在大文件的情况下,似乎会话丢失了,因为我错过了调试并且没有停在下一个断点。 有没有办法阻止执行错过

2 个答案:

答案 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){}
}