当前位置: 代码迷 >> Java Web开发 >> servlet下载文件,弹出下载提示框后servlet被阻塞的有关问题
  详细解决方案

servlet下载文件,弹出下载提示框后servlet被阻塞的有关问题

热度:163   发布时间:2016-04-17 10:59:28.0
servlet下载文件,弹出下载提示框后servlet被阻塞的问题。
很简单的web文件下载,只有一个servlet,用户请求的量比较大。

调试发现,当下载提示框弹出后,在向response.getOutputstream().write()的时候,暂停了。

Java code
。。。。。。。byte[] buffer = new byte[SIZE];byteread = bis.read(buffer);while (-1 != byteread) {                System.out.println("count="+count++);                System.out.println("aaaaaaa");                                       bos.write(buffer, 0, byteread); //A                                                                      System.out.println("bbbbbbb");            byteread = bis.read(buffer);        }bos.flush();bos.close();



代码没有问题,文件可以下载,仅仅 当弹出下载对话框后,我没有立即去点击“下载” 或者“保存” 按钮,就发现
servlet 阻塞在上面代码的A处,直到我点击“下载”按钮或者“保存”按钮,才继续执行,并释放掉servlet所用的线程。
如果,我一直不点击,后台就会报“Connection reset by peer: socket write error”异常。


问题是,我原来总以为,弹出框体后,servlet线程,就执行完毕了,现在居然发现是这样子的,难道 一弹出下载框,servlet就会被阻塞,还是我的代码有问题呢??请各位大大讲解一下。

Java code
                  InputStream bis = null;        OutputStream bos = null;        try {        ServletOutputStream sos = response.getOutputStream();        bis = new BufferedInputStream(new FileInputStream(filePath));        bos = new BufferedOutputStream(sos);        byte[] buffer = new byte[4096];        // 清空response                  response.reset();                  response.setContentType("application/octet-stream;charset=gbk");            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));            response.addHeader("Content-Length", "" + (int)new File(filePath).length());            response.flushBuffer();            response.setStatus(response.SC_OK);             System.out.println("文件读取开始");            int byteread = 0;            byteread = bis.read(buffer);            while (-1 != byteread) {                    System.out.println("aaaaaaa");            bos.write(buffer, 0, byteread);//弹出下载框后,就会阻塞在这里            System.out.println("bbbbbbb");            byteread = bis.read(buffer);            }                 bos.flush();                 bos.close();                     } catch (Exception e) {            System.out.println("error:" + fileName);            e.printStackTrace();        } finally {            if (bis != null) {                bis.close();            }            if (bos != null) {                bos.close();            }        }        System.out.println(fileName + "文件下载完毕.");









------解决方案--------------------
探讨
但是用Ie8每次操作,都直接卡住了,难道和浏览器也有关系? 我觉得客户端不应该也不可能来对服务器端直接控制吧
  相关解决方案