日期:2014-05-17  浏览次数:20789 次

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每次操作,都直接卡住了,难道和浏览器也有关系? 我觉得客户端不应该也不可能来对服务器端直接控制吧