ServletOutputStream过早关闭

时间:2014-01-13 03:23:52

标签: servlets download

我写了一个servlet来下载文件。它适用于某些文件,但对于其他文件,操作系统过早关闭,我最终下载了一个空白文件。

        File file = new File(fileName);

        InputStream fis = new FileInputStream(file);

        resp.setHeader("Content-Type", "text/plain");
        resp.setHeader("Content-Disposition", "attachment; filename=\"" + fileName );
        resp.setDateHeader("Expires",0);
        resp.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
        resp.setHeader("Pragma", "public");

        resp.setContentLength((int) file.length());
        resp.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
        ServletOutputStream os = resp.getOutputStream();
        byte[] bufferData = new byte[1024];
        int read = 0;
        while((read = fis.read(bufferData))!= -1){
            System.out.println("read " + read + " chars");
            os.write(bufferData, 0, read);
        }
        os.flush();
        os.close();
        fis.close();

当我调试时,我可以看到它试图将第一个缓冲区的数据写入os,然后在浏览器端,下载对话框弹出一个空白文件。在servlet中,我在下一个缓冲区写入时得到一个IOClosed。

我尝试使用IOUtils.copy(fis,resp.getOutputStream());

得到同样的错误。

任何原因某些类型的文件数据都会迫使os过早关闭?我能保护它吗?

0 个答案:

没有答案